我正在使用Cocoa3DTutorial课程帮助我,据我所知,他们工作得很好,但是轮班让我很难受。
这是我目前的努力。它提供了正确定位的圆柱体,但所有点都沿着z轴(如图所示:. 我们正朝-z方向看。后面伸出的三角形不是船体的一部分;用于测试/调试。正交圆柱体或多或少是坐标轴,球体是为了确保轴的位置正确,因为我必须使用旋转来正确放置这些圆柱体。顺便说一句,当我使用该算法时,输出向量也会失败,尽管以不同的方式,垂直于平面,但都指向+z而不是某些in-z)
从render3ddocument.m:
// Make the out-pointing vector
C3DTCylinder *outVectTube;
C3DTEntity *outVectEntity;
Point3DFloat *sideCtr = [thisSide centerOfMass];
outVectTube = [C3DTCylinder cylinderWithBase: tubeRadius top: tubeRadius height: tubeRadius*10 slices: 16 stacks: 16];
outVectEntity = [C3DTEntity entityWithStyle:triColor
geometry:outVectTube];
Point3DFloat *outVect = [[thisSide inVect] opposite];
Point3DFloat *unitZ = [Point3DFloat pointWithX:0 Y:0 Z:1.0f];
Point3DFloat *rotAxis = [outVect crossWith:unitZ];
double rotAngle = [outVect angleWith:unitZ];
[outVectEntity setRotationX: rotAxis.x
Y: rotAxis.y
Z: rotAxis.z
W: rotAngle];
[outVectEntity setTranslationX:sideCtr.x - ctrX
Y:sideCtr.y - ctrY
Z:sideCtr.z - ctrZ];
[aScene addChild:outVectEntity];
(请注意,point3float基本上是一个向量类,一个边(如thisside)是一组四个point3float,每个顶点一个,指向外壳中心的向量一个)。
来自c3dtentity.m:
if (_hasTransform) {
glPushMatrix();
// Translation
if ((_translation.x != 0.0) || (_translation.y != 0.0) || (_translation.z != 0.0)) {
glTranslatef(_translation.x, _translation.y, _translation.z);
}
// Scaling
if ((_scaling.x != 1.0) || (_scaling.y != 1.0) || (_scaling.z != 1.0)) {
glScalef(_scaling.x, _scaling.y, _scaling.z);
}
// Rotation
glTranslatef(-_rotationCenter.x, -_rotationCenter.y, -_rotationCenter.z);
if (_rotation.w != 0.0) {
glRotatef(_rotation.w, _rotation.x, _rotation.y, _rotation.z);
} else {
if (_rotation.x != 0.0)
glRotatef(_rotation.x, 1.0f, 0.0f, 0.0f);
if (_rotation.y != 0.0)
glRotatef(_rotation.y, 0.0f, 1.0f, 0.0f);
if (_rotation.z != 0.0)
glRotatef(_rotation.z, 0.0f, 0.0f, 1.0f);
}
glTranslatef(_rotationCenter.x, _rotationCenter.y, _rotationCenter.z);
}
我在上面的代码中添加了一个位,它围绕一个轴使用一个旋转(if(_rotation.w!=0.0)“位),而不是一组三个旋转。我的代码可能是问题所在,但我不知道如何解决。