我进入了我的第一个 3D 游戏。我正在使用搅拌机来创建我的模型,使用子弹进行物理和 Isgl3D 游戏引擎。
到目前为止,我能够
- 在搅拌机中创建模型
- 使用 Isgl3D 库将其导出到 iPhone 并显示它们。
- 沿此模型的顶点创建物理体(对于立方体和球体等简单模型。)
现在我想创建一些复杂的不规则模型,并沿着该模型的顶点创建物理刚体。btTriangleMesh
从我的研究中,我发现btBvhTriangleMeshShape
它可以用来创建复杂的物理刚体。
我找到了这个线程,其中子弹物理体是沿着使用 POD 导入器从搅拌机导出的模型的顶点创建的。但是他们btConvexHullShape
用来创建刚体,这在我的情况下可能不起作用,因为我的要求有不规则的复杂模型。
所以我试图btTriangleMesh
沿着我的模型的顶点创建一个,这样我就可以创建一个btBvhTriangleMeshShape
来创建我的刚体。
因此,对于初学者,我导出了一个立方体(默认搅拌机立方体,放置在原点)以了解顶点如何存储在Isgl3dMeshNode
结构中。这是我的代码
Isgl3dPODImporter * podImporter = [Isgl3dPODImporter
podImporterWithFile:@"simpleCube.pod"];
NSLog(@"number of meshes : %d", podImporter.numberOfMeshes);
[podImporter buildSceneObjects];
[podImporter addMeshesToScene:self.scene];
Isgl3dMeshNode * ground = [podImporter meshNodeWithName:@"Cube"];
btCollisionShape *groundShape = [self getCollisionShapeForNode:ground];
我的getCollisionShapeForNode
方法是
- (btCollisionShape*) getCollisionShapeForNode: (Isgl3dMeshNode*)node{
int numVertices = node.mesh.numberOfVertices;
NSLog(@"no of vertices : %d", numVertices);
NSLog(@"no of indices : %d", node.mesh.numberOfElements);
unsigned char * indices = node.mesh.indices;
btCollisionShape* collisionShape = nil;
btTriangleMesh* triangleMesh = new btTriangleMesh();
for (int i = 0; i < node.mesh.numberOfElements; i+=3) {
NSLog(@"%d %d %d", indices[i], indices[i+1], indices[i+2]);
}
}
并且 NSLog 语句打印..
网格数:1
顶点数:24
指数数量:36
和索引打印为
20 0 21
0 22 0
20 0 22
0 23 0
16 0 17
0 18 0
16 0 18
0 19 0
12 0 13
0 14 0
12 0 14
0 15 0
我不确定我是否理解上面给定的索引(及其指向的顶点)如何构成立方体中的 12 个三角形(每个阶段两个)。我希望索引是这样的(如下所示)
20 21 22 //phase 6
20 22 23
16 17 18 //phase 5
16 18 19
12 13 14 //phase 4
12 14 15
8 9 10 //phase 3
8 10 11
4 5 6 //phase 2
4 6 7
0 1 2 //phase 1
0 2 3
可能我错过了一些明显的东西。但我坚持了一段时间。
任何人都知道从 .POD 文件导出的索引与普通三角形索引有何不同。我不可能从现在打印的索引中制作一个立方体。
还有一个问题,有没有人有一个示例代码可以创建三角形网格来创建物理刚体。