using System; using System.Collections.Generic; using System.Text; using OpenTK.Math; using System.Diagnostics; using OpenTK.OpenGL; using OpenTK.OpenGL.Enums; using OpenTK; using System.Drawing; namespace MathTest { /// /// Demonstrates the GameWindow class. /// public class MainWindow : GameWindow { static void Test(QuaternionD quaternion) { Trace.WriteLine(quaternion.ToString()); Trace.WriteLine(quaternion.Inverse); Trace.WriteLine(quaternion.Inverse.Inverse); Trace.WriteLine(quaternion.Matrix4); } public MainWindow() : base(new DisplayMode(640, 480), "MainWindow") { } public void Initialize() { GL.ClearColor(Color.SteelBlue); Keyboard.KeyDown += new OpenTK.Input.KeyDownEvent(Keyboard_KeyDown); } void Keyboard_KeyDown(OpenTK.Input.KeyboardDevice sender, OpenTK.Input.Key key) { if (key == OpenTK.Input.Key.Escape) { exit = true; } } public void Shutdown() { } protected override void OnResize(OpenTK.Platform.ResizeEventArgs e) { GL.Viewport(0, 0, Width, Height); GL.MatrixMode(MatrixMode.Projection); /* Matrix4 matrix4; Matrix4D matrix4D; double[] doubleArray = new double[16]; Trace.WriteLine(string.Empty); Trace.WriteLine("Frustum Test"); Trace.WriteLine(string.Empty); Trace.WriteLine("OpenTK.Math.Matrix4.Frustum(10, Width, Height, 10, 2.0f, 4.0f)"); Trace.WriteLine(Matrix4.Frustum(10, Width, Height, 10, 2.0f, 4.0f).ToString()); Trace.WriteLine(string.Empty); Trace.WriteLine("OpenTK.Math.Matrix4D.Frustum(10, Width, Height, 10, 2.0d, 4.0d)"); Trace.WriteLine(Matrix4D.Frustum(10, Width, Height, 10, 2.0d, 4.0d).ToString()); Trace.WriteLine(string.Empty); Trace.WriteLine("OpenTK.OpenGL.GL.Frustum(10, Width, Height, 10, 2.0d, 4.0d)"); GL.LoadIdentity(); GL.Frustum(10, Width, Height, 10, 2.0d, 4.0d); GL.GetDouble(GetPName.ProjectionMatrix, doubleArray); Trace.WriteLine( new Matrix4D(doubleArray).ToString() ); Trace.WriteLine(string.Empty); Trace.WriteLine("----------------------------------------"); Trace.WriteLine(string.Empty); Trace.WriteLine("Perspective Test"); Trace.WriteLine(string.Empty); Trace.WriteLine("OpenTK.Math.Matrix4.Perspective(70, 1, 1.0f, 4.0f)"); Trace.WriteLine(Matrix4.Perspective(70, 1, 1.0f, 4.0f).ToString()); Trace.WriteLine(string.Empty); Trace.WriteLine("OpenTK.Math.Matrix4D.Perspective(70, 1, 1.0d, 4.0d)"); Trace.WriteLine(Matrix4D.Perspective(70, 1, 1.0d, 4.0d).ToString()); Trace.WriteLine(string.Empty); Trace.WriteLine("OpenTK.OpenGL.Glu.Perspective(70, 1, 1.0d, 4.0d)"); GL.LoadIdentity(); Glu.Perspective(70, 1, 1.0d, 4.0d); GL.GetDouble(GetPName.ProjectionMatrix, doubleArray); Trace.WriteLine( new Matrix4D(doubleArray).ToString() ); Trace.WriteLine(string.Empty); Trace.WriteLine("----------------------------------------"); Trace.WriteLine(string.Empty); Trace.WriteLine("LookAt Test"); Trace.WriteLine(string.Empty); Trace.WriteLine("OpenTK.Math.Matrix4.LookAt(new Vector3(10, 0, 10), new Vector3(0, 1, 0), new Vector3(0, 1, 0))"); Trace.WriteLine(Matrix4.LookAt(new Vector3(10, 0, 10), new Vector3(0, 1, 0), new Vector3(0, 1, 0)).ToString()); Trace.WriteLine(string.Empty); Trace.WriteLine("OpenTK.Math.Matrix4D.LookAt(new Vector3D(10, 0, 10), new Vector3D(0, 1, 0), new Vector3D(0, 1, 0))"); Trace.WriteLine(Matrix4D.LookAt(new Vector3D(10, 0, 10), new Vector3D(0, 1, 0), new Vector3D(0, 1, 0)).ToString()); Trace.WriteLine(string.Empty); Trace.WriteLine("OpenTK.OpenGL.Glu.LookAt(new Vector3D(10, 0, 10), new Vector3D(0, 1, 0), new Vector3D(0, 1, 0))"); GL.LoadIdentity(); Glu.LookAt(new Vector3(10, 0, 10), new Vector3(0, 1, 0), new Vector3(0, 1, 0)); GL.GetDouble(GetPName.ProjectionMatrix, doubleArray); Trace.WriteLine(new Matrix4D(doubleArray).ToString()); Trace.WriteLine(string.Empty); Trace.WriteLine("----------------------------------------"); Trace.WriteLine(string.Empty); Trace.WriteLine("Rotate Test"); Trace.WriteLine(string.Empty); Trace.WriteLine("OpenTK.Math.Matrix4.Rotate(new Vector3(1, 2, 3), 17))"); Trace.WriteLine(Matrix4.Rotate(new Vector3(1, 2, 3), 17).ToString()); Trace.WriteLine(string.Empty); Trace.WriteLine("OpenTK.Math.Matrix4D.Rotate(new Vector3(1, 2, 3), 17))"); Trace.WriteLine(Matrix4D.Rotate(new Vector3D(1, 2, 3), 17).ToString()); Trace.WriteLine(string.Empty); Trace.WriteLine("OpenTK.OpenGL.GL.Rotate(17, new Vector3(1, 2, 3))"); GL.LoadIdentity(); GL.Rotate(17, new Vector3(1, 2, 3)); GL.GetDouble(GetPName.ProjectionMatrix, doubleArray); Trace.WriteLine(new Matrix4D(doubleArray).ToString()); Trace.WriteLine(string.Empty); Trace.WriteLine("----------------------------------------"); Trace.WriteLine(string.Empty); Trace.WriteLine("Rotate X Test"); Trace.WriteLine(string.Empty); Trace.WriteLine("OpenTK.Math.Matrix4.RotateX(17))"); Trace.WriteLine(Matrix4.RotateX(17).ToString()); Trace.WriteLine(string.Empty); Trace.WriteLine("OpenTK.Math.Matrix4D.RotateX(17))"); Trace.WriteLine(Matrix4D.RotateX(17).ToString()); Trace.WriteLine(string.Empty); Trace.WriteLine("OpenTK.OpenGL.GL.Rotate(17, new Vector3(1, 0, 0))"); GL.LoadIdentity(); GL.Rotate(17, new Vector3(1, 0, 0)); GL.GetDouble(GetPName.ProjectionMatrix, doubleArray); Trace.WriteLine(new Matrix4D(doubleArray).ToString()); Trace.WriteLine(string.Empty); Trace.WriteLine("----------------------------------------"); Trace.WriteLine(string.Empty); Trace.WriteLine("Translate Test"); Trace.WriteLine(string.Empty); Trace.WriteLine("OpenTK.Math.Matrix4.Translate(1, 2, 3)"); Trace.WriteLine(Matrix4.Translation(1, 2, 3).ToString()); Trace.WriteLine(string.Empty); Trace.WriteLine("OpenTK.Math.Matrix4D.Translate(1, 2, 3))"); Trace.WriteLine(Matrix4D.Translate(1, 2, 3).ToString()); Trace.WriteLine(string.Empty); Trace.WriteLine("OpenTK.OpenGL.GL.Translate(1, 2, 3)"); GL.LoadIdentity(); GL.Translate(1, 2, 3); GL.GetDouble(GetPName.ProjectionMatrix, doubleArray); Trace.WriteLine(new Matrix4D(doubleArray).ToString()); Trace.WriteLine(string.Empty); Trace.WriteLine("----------------------------------------"); Trace.WriteLine(string.Empty); Trace.WriteLine("Scale Test"); Trace.WriteLine(string.Empty); Trace.WriteLine("OpenTK.Math.Matrix4.Scale(1, 2, 3)"); Trace.WriteLine(Matrix4.Scale(1, 2, 3).ToString()); Trace.WriteLine(string.Empty); Trace.WriteLine("OpenTK.Math.Matrix4D.Scale(1, 2, 3))"); Trace.WriteLine(Matrix4D.Scale(1, 2, 3).ToString()); Trace.WriteLine(string.Empty); Trace.WriteLine("OpenTK.OpenGL.GL.Scale(1, 2, 3)"); GL.LoadIdentity(); GL.Scale(1, 2, 3); GL.GetDouble(GetPName.ProjectionMatrix, doubleArray); Trace.WriteLine(new Matrix4D(doubleArray).ToString()); Trace.WriteLine(string.Empty); Trace.WriteLine("----------------------------------------"); Trace.WriteLine(string.Empty); Trace.WriteLine("Inverse Test"); Trace.WriteLine(string.Empty); Trace.WriteLine("Matrix4.Invert(Matrix4.Perspective(70, 1, 1.0f, 4.0f))"); Trace.WriteLine(Matrix4.Perspective(70, 1, 1.0f, 4.0f).ToString()); Trace.WriteLine(string.Empty); Trace.WriteLine(Matrix4.Invert(Matrix4.Perspective(70, 1, 1.0f, 4.0f)).ToString()); Trace.WriteLine(string.Empty); Trace.WriteLine(Matrix4.Invert(Matrix4.Invert(Matrix4.Perspective(70, 1, 1.0f, 4.0f))).ToString()); Trace.WriteLine(string.Empty); Trace.WriteLine("Matrix4D.Perspective(70, 1, 1.0d, 4.0d).Inverse"); Trace.WriteLine(Matrix4D.Perspective(70, 1, 1.0d, 4.0d).ToString()); Trace.WriteLine(string.Empty); Trace.WriteLine(Matrix4D.Perspective(70, 1, 1.0d, 4.0d).Inverse.ToString()); Trace.WriteLine(string.Empty); Trace.WriteLine(Matrix4D.Perspective(70, 1, 1.0d, 4.0d).Inverse.Inverse.ToString()); Trace.WriteLine(string.Empty); Trace.WriteLine("----------------------------------------"); Trace.WriteLine(string.Empty); Trace.WriteLine("Multiply Test"); Trace.WriteLine(string.Empty); Trace.WriteLine("Matrix4.Frustum(10, Width, Height, 10, 2.0f, 4.0f) * Matrix4.Perspective(70, 1, 1.0f, 4.0f)"); Trace.WriteLine((Matrix4.Frustum(10, Width, Height, 10, 2.0f, 4.0f) * Matrix4.Perspective(70, 1, 1.0f, 4.0f)).ToString()); Trace.WriteLine(string.Empty); Trace.WriteLine("Matrix4D.Frustum(10, Width, Height, 10, 2.0f, 4.0f) * Matrix4D.Perspective(70, 1, 1.0f, 4.0f)"); Trace.WriteLine((Matrix4D.Frustum(10, Width, Height, 10, 2.0d, 4.0d) * Matrix4D.Perspective(70, 1, 1.0d, 4.0d)).ToString()); Trace.WriteLine(string.Empty); Trace.WriteLine("GL.Frustum(10, Width, Height, 10, 2.0d, 4.0d) Glu.Perspective(70, 1, 1.0d, 4.0d)"); GL.LoadIdentity(); GL.Frustum(10, Width, Height, 10, 2.0d, 4.0d); Glu.Perspective(70, 1, 1.0d, 4.0d); GL.GetDouble(GetPName.ProjectionMatrix, doubleArray); Trace.WriteLine( new Matrix4D(doubleArray).ToString() ); */ /* Trace.WriteLine(string.Empty); Trace.WriteLine("----------------------------------------"); Trace.WriteLine(string.Empty); Trace.WriteLine((Matrix4D.RotateX(45) * new Vector4D(1, 2, 3, 1)).ToString()); Trace.WriteLine((Matrix4D.RotateX(45).Quaternion.Matrix4 * new Vector4D(1, 2, 3, 1)).ToString()); Vector3D axis; double angle; Trace.WriteLine(string.Empty); Trace.WriteLine("----------------------------------------"); Matrix4D.RotateX(45).Quaternion.GetAxisAndAngle(out axis, out angle); Trace.WriteLine(axis.ToString()); Trace.WriteLine(angle.ToString()); Trace.WriteLine("----------------------------------------"); Matrix4D.RotateY(45).Quaternion.GetAxisAndAngle(out axis, out angle); Trace.WriteLine(axis.ToString()); Trace.WriteLine(angle.ToString()); Trace.WriteLine("----------------------------------------"); Matrix4D.RotateZ(45).Quaternion.GetAxisAndAngle(out axis, out angle); Trace.WriteLine(axis.ToString()); Trace.WriteLine(angle.ToString()); Trace.WriteLine("----------------------------------------"); Matrix4D.Rotate(new Vector3D(1, 2, 3), 45).Quaternion.GetAxisAndAngle(out axis, out angle); Trace.WriteLine(axis.ToString()); Trace.WriteLine(angle.ToString()); Trace.WriteLine("----------------------------------------"); Trace.WriteLine("----------------------------------------"); Trace.WriteLine(string.Empty); Trace.WriteLine(Matrix4D.RotateX(45).ToString()); Trace.WriteLine(string.Empty); Trace.WriteLine(Matrix4D.RotateX(45).Quaternion.ToString()); Trace.WriteLine(string.Empty); Matrix4D.RotateX(45).Quaternion.GetAxisAndAngle(out axis, out angle); Trace.WriteLine(axis.ToString()); Trace.WriteLine(angle.ToString()); Trace.WriteLine(string.Empty); Trace.WriteLine(Matrix4D.RotateX(45).Quaternion.Matrix4.ToString()); Trace.WriteLine(string.Empty); Trace.WriteLine(Matrix4D.RotateX(45).Quaternion.Matrix4.Quaternion.ToString()); Trace.WriteLine(string.Empty); Matrix4D.RotateX(45).Quaternion.Matrix4.Quaternion.GetAxisAndAngle(out axis, out angle); Trace.WriteLine(axis.ToString()); Trace.WriteLine(angle.ToString()); */ Vector3D axis; double angle; QuaternionD quaternion = new QuaternionD(new Vector3D(1, 1, 1), -45); quaternion.GetAxisAndAngle(out axis, out angle); Trace.WriteLine(axis.ToString() + " " + angle.ToString()); quaternion.Matrix4.Quaternion.GetAxisAndAngle(out axis, out angle); Trace.WriteLine(axis.ToString() + " " + angle.ToString()); Matrix4D matrix = Matrix4D.RotateX(45) * Matrix4D.Scale(2, 2, 2); Trace.WriteLine(matrix.ToString()); Trace.WriteLine(matrix.Quaternion.ToString()); matrix.Quaternion.GetAxisAndAngle(out axis, out angle); Trace.WriteLine(axis.ToString() + " " + angle.ToString()); Trace.WriteLine(matrix.Quaternion.Matrix4.ToString()); base.OnResize(e); } public void Update(float tick) { } public void Render(float tick) { GL.Clear(ClearBufferMask.ColorBufferBit); this.SwapBuffers(); } float UpdateTick = 0; new float UpdateFrequency = 0; float RenderTick = 0; new float RenderFrequency = 0; bool exit = false; public void Process(int updatesPerSecond, int framesPerSecond) { Initialize(); ProcessEvents(); //Quaterniond quaternion = new Quaterniond(1, 2, 3, 4); //Test(QuaternionD.XAxis); Shutdown(); } [STAThread] public static void Main() { using (MainWindow example = new MainWindow()) { example.Process(30, 30); } } } }