/// <summary> /// /// </summary> /// <param name="timeSinceLastFrame"></param> public void UpdateGeometry(float timeSinceLastFrame) { // Calculate wind offset Vector2 cameraDirection = new Vector2(_vclouds.Camera.DerivedDirection.x, _vclouds.Camera.DerivedDirection.z); float offset = -cameraDirection.DotProduct(_vclouds.WindDirectionAsVector2) * _vclouds.WindSpeed * timeSinceLastFrame; _worldOffset += _vclouds.WindDirectionAsVector2 * _vclouds.WindSpeed * timeSinceLastFrame; // Calculate camera offset Vector2 cameraOffset = new Vector2(_vclouds.Camera.DerivedPosition.x - _lastCameraPosition.x, _vclouds.Camera.DerivedPosition.z - _lastCameraPosition.z); offset -= cameraOffset.DotProduct(cameraDirection); _worldOffset += cameraOffset; for (int k = 0; k < _numberOfBlocks; k++) { _geometryBlocks[k].Update(offset); _geometryBlocks[k].WorldOffset = _worldOffset; } }
// * // * Equivalent of Ogre::Vector3::angleBetween, applied to Ogre::Vector2 // public static Radian angleBetween(Vector2 v1, Vector2 v2) { float lenProduct = v1.Length * v2.Length; // Divide by zero check if (lenProduct < 1e-6f) lenProduct = 1e-6f; float f = v1.DotProduct(v2) / lenProduct; f = Math_Clamp(f, -1.0f, 1.0f); return Math.ACos(f); }