我正在创建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/

10-09 10:20