gpt4 book ai didi

c - 源引擎风格的绳索渲染

转载 作者:太空狗 更新时间:2023-10-29 17:26:11 26 4
gpt4 key购买 nike

我正在创建一个 3D 图形引擎,其中一个要求是绳索的行为类似于 Valve 的源引擎。

所以在源引擎中,一段绳子是一个四边形,它沿着它的方向轴旋转以面对相机,所以如果绳子的部分是在+Z方向,它会沿着Z轴旋转所以它面对正对相机的中心位置。

目前,我已经定义了绳索的各个部分,所以我可以得到一个漂亮的弯曲绳索,但现在我正在尝试构建将沿着它的方向 vector 旋转它的矩阵。

我已经有了一个基于这种广告牌技术渲染广告牌 Sprite 的矩阵: Constructing a Billboard Matrix目前,我一直在尝试重新调整它,使右、上、前 vector 与绳段的方向 vector 相匹配。

我的绳子是由多个部分组成的,每个部分都是一个由两个三角形组成的矩形,正如我上面所说的,我可以得到完美的位置和部分,这是旋转面对相机让我很多问题。

这是在 OpenGL ES2 中用 C 编写的。

我在 Model_beam.cpp 中研究了毁灭战士 3 的光束渲染代码,那里使用的方法是根据法线而不是使用矩阵来计算偏移量,所以我在我的 C 代码中创建了一个类似的技术并且它有点管用,至少它现在可以满足我的需要。

所以对于那些也在尝试解决这个问题的人来说,使用绳子中点与相机位置的叉积,将其归一化,然后将其乘以您想要绳子的宽度,然后在构造顶点时,在结果 vector 的 + 或 - 方向上偏移每个顶点。

进一步的帮助会更好,因为这并不完美!

谢谢

最佳答案

查看 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com