我想显示绘制一个从a点开始的圆柱体并且指向我认为该键位于第一个glRotated中,但这是我第一次使用openGL a和b是btVector3
glPushMatrix();
glTranslatef(a.x(), a.y(), a.z());
glRotated(0, b.x(), b.y(), b.z());
glutSolidCylinder(.01, .10 ,20,20);
glPopMatrix();
有什么建议吗?
答案 0 :(得分:0)
旋转0度后,你的旋转不会做任何事情。
你希望axiz z指向b。
为此,您需要计算z轴(0,0,1)和范数(b - a)(即arccos(z dot norm(b - a))
)之间的角度,并且需要围绕z轴之间的叉积旋转该量和b - a。您的矢量库应该已经实现了这些方法(点和交叉产品)。
norm(x)是x的标准化版本,长度为1的那个。
答案 1 :(得分:0)
根据glutsolidcylinder(3) - Linux man page:
glutSolidCylinder()绘制一个阴影圆柱体,其底部的中心位于原点,其轴线沿正z轴。
因此,您必须分别准备转换:
glRotatef()
的使用似乎也被误解了,
这将导致:
// center of cylinder
const btVector3 c = 0.5 * (a + b);
// axis of cylinder
const btVector3 axis = b - a;
// determine angle between axis of cylinder and z-axis
const btVector3 zAxis(0.0, 0.0, 1.0);
const btScalar angle = zAxis.angle(axis);
// determine rotation axis to turn axis of cylinder to z-axis
const btVector3 axisT = zAxis.cross(axis).normalize();
// do transformations
glTranslatef(c.x(), c.y(), c.z());
if (axisT.norm() > 1E-6) { // skip this if axis and z-axis are parallel
const GLfloat radToDeg = 180.0f / 3.141593f;
glRotatef(angle * radToDeg, axisT.x(), axisT.y(), axisT.z());
}
glutSolidCylinder(0.1, axis.length(), 20, 20);
我没有记住这段代码(使用我之前从未使用过的btVector3
文档)。因此,请带上一粒盐。 (可能需要调试。)
所以,请记住以下几点:
文件。没有提到btVector3::angle()
是否以度数或弧度返回角度 - 我假设为弧度。
编写此类代码时,我经常会意外地翻转内容(例如旋转到相反的方向)。这样的事情,我通常在调试中修复,这可能是上面的示例代码所必需的。
如果( b - a )已经沿着正或负z轴,那么( b - a )×(0,0,1)将产生0向量。不幸的是,文件。 btVector3::normalize()
的{0}没有提到应用于0向量时会发生什么。如果在这种情况下抛出异常,则必须添加额外的检查。