使用C# SharpGL 显示加载并显示的3D模型
绘制图形的代码如下
private void ListOfRobot(OpenGL gl, int n)
{
// 开启光照
gl.Enable(OpenGL.GL_LIGHTING);
gl.Enable(OpenGL.GL_LIGHT0);
gl.Enable(OpenGL.GL_LIGHT1);
// 设置模型材质(可以从源STL文件中获取)
SetRobotMaterial(gl);
tpMesh = ModelFile.mesh[n];
int YU = 1;
// 绘制模型
gl.Begin(OpenGL.GL_TRIANGLES);
for (int i = 0; i < tpMesh.F.Count(); i++)
{
if (tpMesh.VT.Count() != 0) gl.TexCoord(tpMesh.VT[tpMesh.F[i].T[0]].TU, tpMesh.VT[tpMesh.F[i].T[0]].TV); //纹理
if (tpMesh.VN.Count() != 0) gl.Normal(tpMesh.VN[tpMesh.F[i].N[0]].NX, tpMesh.VN[tpMesh.F[i].N[0]].NY, -tpMesh.VN[tpMesh.F[i].N[0]].NZ);//法向量
gl.Vertex(tpMesh.V[tpMesh.F[i].V[0]].X / YU, tpMesh.V[tpMesh.F[i].V[0]].Y / YU, -tpMesh.V[tpMesh.F[i].V[0]].Z / YU); // 上顶点
if (tpMesh.VT.Count() != 0) gl.TexCoord(tpMesh.VT[tpMesh.F[i].T[1]].TU, tpMesh.VT[tpMesh.F[i].T[1]].TV); //纹理
if (tpMesh.VN.Count() != 0) gl.Normal(tpMesh.VN[tpMesh.F[i].N[1]].NX, tpMesh.VN[tpMesh.F[i].N[1]].NY, -tpMesh.VN[tpMesh.F[i].N[1]].NZ);//法向量
gl.Vertex(tpMesh.V[tpMesh.F[i].V[1]].X / YU, tpMesh.V[tpMesh.F[i].V[1]].Y / YU, -tpMesh.V[tpMesh.F[i].V[1]].Z / YU); // 左下
if (tpMesh.VT.Count() != 0) gl.TexCoord(tpMesh.VT[tpMesh.F[i].T[2]].TU, tpMesh.VT[tpMesh.F[i].T[2]].TV); //纹理
if (tpMesh.VN.Count() != 0) gl.Normal(tpMesh.VN[tpMesh.F[i].N[2]].NX, tpMesh.VN[tpMesh.F[i].N[2]].NY, -tpMesh.VN[tpMesh.F[i].N[2]].NZ);//法向量
gl.Vertex(tpMesh.V[tpMesh.F[i].V[2]].X / YU, tpMesh.V[tpMesh.F[i].V[2]].Y / YU, -tpMesh.V[tpMesh.F[i].V[2]].Z / YU); // 右下
}
gl.End();
}
显示效果不太理想,主要是有些黑色杂乱的地方。
希望可以去掉这些黑色部分。
补充一下图形显示效果
应该是纹理材质的应试没达到位置
这个程序员不纠结了,让3d人员在建模工具里试验好,让他告诉你用啥材料,用啥光源,用啥法线贴图(对比一下美图秀秀这类把,其实美图秀秀这种都是先让美工在ps操作,然后告诉程序员他用了啥步骤和滤镜,程序员在上手写成模板代码的,玩3d的都一样。3d的先出一个流程,程序在变成自动化和傻瓜化操作)
总体上上模型有些显的粗糙,但是貌似光源和法线贴图没处理好
光照设置不当引起的,你试试把光照关掉看一下。