我正在创建3D图形引擎,其中一项要求是绳索的行为类似于Valve的源引擎。
因此,在源引擎中,绳索的一部分是一个四边形,它沿着其方向轴旋转以面向摄像头,因此,如果绳索的一部分在+ Z方向上,它将沿Z轴旋转,因此其面对着镜头。相机的中心位置。
目前,我已经定义了绳索的各个部分,因此我可以拥有一条漂亮的弯曲绳索,但是现在我试图构造一个矩阵,该矩阵将沿其方向 vector 旋转它。
我已经有一个基于此广告牌技术渲染广告牌 Sprite 的矩阵:
Constructing a Billboard Matrix
目前,我一直在尝试对其进行重新设计,以使“向右”,“向上”,“向前” vector 与绳索段的方向 vector 匹配。
我的绳索由多个部分组成,每个部分都是由两个三角形组成的矩形,正如我上面所说,我可以使位置和部分变得完美,面对照相机的旋转是造成我很多问题的原因。
这是在OpenGL ES2中并用C编写的。
我已经在Model_beam.cpp中研究了《毁灭战士3》的光束渲染代码,那里使用的方法是基于法线而不是使用矩阵来计算偏移量,因此我在C代码中创建了一种类似的技术,至少可以做到这一点。 ,现在就可以满足我的需要。
因此,对于那些也想弄清楚这一点的人,请使用绳索中点与相机位置的叉积,将其归一化,然后将其乘以您希望绳索的宽度,然后在构造时顶点,使每个顶点在所得 vector 的+或-方向上偏移。
尽管这不是完美的方法,但是进一步的帮助将是巨大的!
谢谢
最佳答案
checkout this related stackoverflow post on billboards in OpenGL它引用了一个lighthouse3d教程,非常不错。这是该技术的重点:
void billboardCylindricalBegin(
float camX, float camY, float camZ,
float objPosX, float objPosY, float objPosZ) {
float lookAt[3],objToCamProj[3],upAux[3];
float modelview[16],angleCosine;
glPushMatrix();
// objToCamProj is the vector in world coordinates from the
// local origin to the camera projected in the XZ plane
objToCamProj[0] = camX - objPosX ;
objToCamProj[1] = 0;
objToCamProj[2] = camZ - objPosZ ;
// This is the original lookAt vector for the object
// in world coordinates
lookAt[0] = 0;
lookAt[1] = 0;
lookAt[2] = 1;
// normalize both vectors to get the cosine directly afterwards
mathsNormalize(objToCamProj);
// easy fix to determine wether the angle is negative or positive
// for positive angles upAux will be a vector pointing in the
// positive y direction, otherwise upAux will point downwards
// effectively reversing the rotation.
mathsCrossProduct(upAux,lookAt,objToCamProj);
// compute the angle
angleCosine = mathsInnerProduct(lookAt,objToCamProj);
// perform the rotation. The if statement is used for stability reasons
// if the lookAt and objToCamProj vectors are too close together then
// |angleCosine| could be bigger than 1 due to lack of precision
if ((angleCosine < 0.99990) && (angleCosine > -0.9999))
glRotatef(acos(angleCosine)*180/3.14,upAux[0], upAux[1], upAux[2]);
}
关于c - 源引擎样式的绳索渲染,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15881684/