/// <summary> /// GL draw solid. /// </summary> /// <param name="solid">Solid.</param> /// <param name="GLM_TEXTURE">If set to <c>true</c> GL add texture coordinates.</param> /// <param name="GLM_FLAT">If set to <c>true</c> GL add plane normal.</param> private static void GLDrawSolid( LoadResult solid, PhysicsEngineMathUtility.Vector3 translate, bool GLM_TEXTURE, bool GLM_FLAT, bool GLM_SMOOTH) { int[] indicedata = new int[solid.Groups [0].Faces.Count * 3]; int[] textureData = new int[solid.Groups [0].Faces.Count * 3]; int[] normalData = new int[solid.Groups [0].Faces.Count * 3]; GL.Begin (PrimitiveType.Triangles); for (int i = 0; i < solid.Groups [0].Faces.Count; i++) { int index = i * 3; indicedata [index] = solid.Groups [0].Faces [i] [0].VertexIndex - 1; indicedata [index + 1] = solid.Groups [0].Faces [i] [1].VertexIndex - 1; indicedata [index + 2] = solid.Groups [0].Faces [i] [2].VertexIndex - 1; textureData [index] = solid.Groups [0].Faces [i] [0].TextureIndex - 1; textureData [index + 1] = solid.Groups [0].Faces [i] [1].TextureIndex - 1; textureData [index + 2] = solid.Groups [0].Faces [i] [2].TextureIndex - 1; normalData [index] = solid.Groups [0].Faces [i] [0].NormalIndex - 1; normalData [index + 1] = solid.Groups [0].Faces [i] [1].NormalIndex - 1; normalData [index + 2] = solid.Groups [0].Faces [i] [2].NormalIndex - 1; if (GLM_FLAT) { var a = new PhysicsEngineMathUtility.Vector3 ( solid.Vertices [indicedata [index]].X, solid.Vertices [indicedata [index]].Y, solid.Vertices [indicedata [index]].Z); var b = new PhysicsEngineMathUtility.Vector3 ( solid.Vertices [indicedata [index + 1]].X, solid.Vertices [indicedata [index + 1]].Y, solid.Vertices [indicedata [index + 1]].Z); var c = new PhysicsEngineMathUtility.Vector3 ( solid.Vertices [indicedata [index + 2]].X, solid.Vertices [indicedata [index + 2]].Y, solid.Vertices [indicedata [index + 2]].Z); PhysicsEngineMathUtility.Vector3 normal = PhysicsEngineMathUtility.GeometryUtilities.CalculateNormal (a, b, c); GL.Normal3 (normal.x, normal.y, normal.z); } if (GLM_SMOOTH) GL.Normal3 (solid.Normals[normalData[index]].X, solid.Normals[normalData[index]].Y, solid.Normals[normalData[index]].Z); if (GLM_TEXTURE && solid.Textures.Count > 0) GL.TexCoord2 (solid.Textures [textureData [index]].X, solid.Textures [textureData [index]].Y); GL.Vertex3 (solid.Vertices [indicedata [index]].X - translate.x, solid.Vertices [indicedata [index]].Y - translate.y, solid.Vertices [indicedata [index]].Z - translate.z); if (GLM_SMOOTH) GL.Normal3 (solid.Normals[normalData[index + 1]].X, solid.Normals[normalData[index + 1]].Y, solid.Normals[normalData[index + 1]].Z); if (GLM_TEXTURE && solid.Textures.Count > 0) GL.TexCoord2 (solid.Textures [textureData [index + 1]].X, solid.Textures [textureData [index + 1]].Y); GL.Vertex3 (solid.Vertices [indicedata [index + 1]].X - translate.x, solid.Vertices [indicedata [index + 1]].Y - translate.y, solid.Vertices [indicedata [index + 1]].Z - translate.z); if (GLM_SMOOTH) GL.Normal3 (solid.Normals[normalData[index + 2]].X, solid.Normals[normalData[index + 2]].Y, solid.Normals[normalData[index + 2]].Z); if (GLM_TEXTURE && solid.Textures.Count > 0) GL.TexCoord2 (solid.Textures [textureData [index + 2]].X, solid.Textures [textureData [index + 2]].Y); GL.Vertex3 (solid.Vertices [indicedata [index + 2]].X - translate.x, solid.Vertices [indicedata [index + 2]].Y - translate.y, solid.Vertices [indicedata [index + 2]].Z - translate.z); } GL.End (); }
public static void glLookAt( PhysicsEngineMathUtility.Vector3 eye, PhysicsEngineMathUtility.Vector3 center, PhysicsEngineMathUtility.Vector3 up) { PhysicsEngineMathUtility.Vector3 forward = center - eye; forward = PhysicsEngineMathUtility.Vector3.Normalize(forward); var upBuf = new PhysicsEngineMathUtility.Vector3(up.x, up.y, up.z); var side = PhysicsEngineMathUtility.Vector3.Cross(forward, upBuf); side = PhysicsEngineMathUtility.Vector3.Normalize(side); upBuf = PhysicsEngineMathUtility.Vector3.Cross(side, forward); var matrix = new float[] { Convert.ToSingle (side.x), Convert.ToSingle (up.x), Convert.ToSingle (-forward.x), Convert.ToSingle (side.y), Convert.ToSingle (up.y), Convert.ToSingle (-forward.y), Convert.ToSingle (side.z), Convert.ToSingle (up.z), Convert.ToSingle (-forward.z) }; GL.MultMatrix(matrix); GL.Translate(-eye.x, -eye.y, -eye.z); }