/// <summary> /// 绘制立方体 /// </summary> public void DrawMesh(Mesh mesh, SoftRenderDrawMode drawMode = SoftRenderDrawMode.Triangles) { currentDrawMesh = mesh; // 坐标/旋转与缩放 angel = (angel + 1) % 720; Vector3 rotation = new Vector3(angel, angel, angel); Vector3 scale = new Vector3(1, 1, 1) * 0.5f; Vector3 worldPosition = new Vector3(0, 0, 0); // 构建M矩阵 Matrix4x4 modelMatrix = Matrix.GetModelMatrix(worldPosition, rotation, scale); // 构建V矩阵 Matrix4x4 viewMatrix = camera.GetViewMatrix(); // 构建P矩阵 Matrix4x4 projectionMatrix = camera.GetProjectionMatrix(); // 构建MVP矩阵 //Matrix4x4 MVPMatrix = projectionMatrix * viewMatrix * modelMatrix; //// 给每个顶点引用一份MVP矩阵 //foreach (int i in mesh.triangles) { // Vertex v = mesh.vertices[i]; // v.mMatrix = modelMatrix; // v.vMatrix = viewMatrix; // v.pMatrix = projectionMatrix; //} mesh.mMatrix = modelMatrix; mesh.vMatrix = viewMatrix; mesh.pMatrix = projectionMatrix; DrawElement(mesh, modelMatrix, viewMatrix, projectionMatrix, drawMode); }
public void DrawMesh(Mesh mesh, Vector3 position, Vector3 scale, Vector3 rotation, SoftRenderDrawMode softRenderDrawMode) { // 构建M矩阵 Matrix4x4 modelMatrix = Matrix.GetModelMatrix(position, rotation, scale); // 构建V矩阵 Matrix4x4 viewMatrix = camera.GetViewMatrix(); // 构建P矩阵 Matrix4x4 projectionMatrix = camera.GetProjectionMatrix(); // 构建MVP矩阵 //Matrix4x4 MVPMatrix = projectionMatrix * viewMatrix * modelMatrix; // 给每个顶点引用一份MVP矩阵 //foreach (int i in mesh.triangles) { // Vertex v = mesh.vertices[i]; // v.mMatrix = modelMatrix; // v.vMatrix = viewMatrix; // v.pMatrix = projectionMatrix; //} mesh.mMatrix = modelMatrix; mesh.vMatrix = viewMatrix; mesh.pMatrix = projectionMatrix; DrawElement(mesh, modelMatrix, viewMatrix, projectionMatrix, softRenderDrawMode); }
/// <summary> /// 根据传递的Vertex数组和triangleIndex数组来绘制3D图形 /// triangleIndex表示顶点的顺序,triangleIndex[1] = 1, /// 表示第二个顶点是Vertex数组的第二个元素 /// 绘制的规则是, /// 每三个成一个三角形进行绘制 /// </summary> /// <param name="vertices"></param> /// <param name="triangle"></param> /// <param name="mvp"></param> /// <param name="drawMode">默认为连续三角形绘制</param> public void DrawElement(Mesh mesh, Matrix4x4 mMatrix, Matrix4x4 vMatrix, Matrix4x4 pMatrix, SoftRenderDrawMode drawMode = SoftRenderDrawMode.Triangles) { int[] triangle = mesh.triangles; Vertex[] vertices = mesh.vertices; if (triangle.Length % 3 != 0) { return; } switch (drawMode) { case SoftRenderDrawMode.Triangles: for (int i = 0; i < triangle.Length; i += 3) { Vertex v1 = vertices[triangle[i]]; Vertex v2 = vertices[triangle[i + 1]]; Vertex v3 = vertices[triangle[i + 2]]; DrawPrimitive(v1, v2, v3, mMatrix, vMatrix, pMatrix); } break; case SoftRenderDrawMode.Triangles_FUN: Vertex v_init = vertices[triangle[0]]; for (int i = 1; i + 1 < triangle.Length; i += 2) { Vertex v2 = vertices[triangle[i]]; Vertex v3 = vertices[triangle[i + 1]]; DrawPrimitive(v_init, v2, v3, mMatrix, vMatrix, pMatrix); } break; case SoftRenderDrawMode.TRIANGLE_STRIP: Vertex vfirset = vertices[triangle[0]]; Vertex vsecond = vertices[triangle[1]]; Vertex vthird = vertices[triangle[2]]; DrawPrimitive(vfirset, vsecond, vthird, mMatrix, vMatrix, pMatrix); for (int i = 3; i < triangle.Length; i++) { Vertex v1 = vertices[triangle[i - 2]]; Vertex v2 = vertices[triangle[i - 1]]; Vertex v3 = vertices[triangle[i]]; DrawPrimitive(v1, v2, v3, mMatrix, vMatrix, pMatrix); } break; } }