internal static void CalculateSlopeAngle(ref Vector3 vec, out float angle) { Vector3 up = Vector3.UnitY; float dot; Vector3.Dot(ref vec, ref up, out dot); angle = (float)Math.Acos(dot); }
/// <summary> /// Solve A * x = b, where b is a column vector. This is more efficient /// than computing the inverse in one-shot cases. /// </summary> /// <param name="b">The b.</param> /// <returns></returns> public Vector3 Solve33(Vector3 b) { float det = Vector3.Dot(ex, Vector3.Cross(ey, ez)); if (det != 0.0f) { det = 1.0f / det; } return(new Vector3(det * Vector3.Dot(b, Vector3.Cross(ey, ez)), det * Vector3.Dot(ex, Vector3.Cross(b, ez)), det * Vector3.Dot(ex, Vector3.Cross(ey, b)))); }
private void ApplyMovement(ref Vector3 cursorVector, ref Vector3 cameraRight, ref Vector3 cameraUp, ref Vector3 vectorToMoveAlong) { if (vectorToMoveAlong != new Vector3(0, 0, 0)) { // This is old code that I wrote LONG ago--------------------------------------------------- //int baseScreenX = 0; //int baseScreenY = 0; //MathFunctions.AbsoluteToWindow(origin.Parent.X, origin.Parent.Y, origin.Parent.Z, ref baseScreenX, ref baseScreenY, SpriteManager.Camera, true); //int endScreenX = 0; //int endScreenY = 0; //MathFunctions.AbsoluteToWindow( // origin.Parent.X + vectorToMoveAlong.X, // origin.Parent.Y + vectorToMoveAlong.Y, // origin.Parent.Z + vectorToMoveAlong.Z, // ref endScreenX, ref endScreenY, SpriteManager.Camera, true); //// invert the Y //Vector3 moveAlongProjected = new Vector3(endScreenX - baseScreenX, baseScreenY - endScreenY, 0); //float worldXChange; //float worldYChange; //MathFunctions.ScreenToAbsoluteDistance(GuiManager.Cursor.LastScreenX - GuiManager.Cursor.ScreenX, // GuiManager.Cursor.LastScreenY - GuiManager.Cursor.ScreenY, // out worldXChange, out worldYChange, origin.Parent.Z, SpriteManager.Camera); //Vector3 rightProjected = worldXChange * moveAlongProjected.X * cameraRight; //Vector3 upProjected = worldYChange * moveAlongProjected.Y * cameraUp; //Vector3 normalizedProjected = Vector3.Normalize(rightProjected + upProjected); // end of old code----------------------------------------------------------------------------- changeVector = Vector3.Dot(cursorVector, vectorToMoveAlong) * vectorToMoveAlong; if (UpdatePositionsImmediately) { origin.Parent.Position += changeVector; } } }
public static float Dot(Vector3 a, Vector3 b) { return(MonoGameVector3.Dot(a.MonoGameVector, b.MonoGameVector)); }