其他分享
首页 > 其他分享> > c – 3D场景转换不太有效

c – 3D场景转换不太有效

作者:互联网

为了将屏幕空间坐标转换为世界空间坐标,我一直在做以下计算:

WorldSpace Vector =逆(投影矩阵)*逆(View Matrix)* ScreenSpace矢量

到目前为止,我相信我的大部分计算都是正确的,但是我不确定如何执行所需的最后一步,以便将我的矢量转换为世界坐标.

问题:

>我被告知这个过程的最后一步是将结果除以变量“w”,因为我们使用齐次坐标.但是我不知道“w”代表什么.

我已经定义了以下变量(x和y是鼠标坐标的整数):

GLint viewport[4];
GLfloat winX, winY;
glGetIntegerv(GL_VIEWPORT, viewport);

winX = ((float)x/viewport[2]*2)-1;
winY = ((float)(viewport[3]-y)/viewport[3]*2)-1;

glm::mat4x4 mMatrix;
glm::mat4x4 vMatrix;

glm::mat4x4 cameraTransformation;

我执行了以下转换:

cameraTransformation = glm::rotate(cameraTransformation, (float)alpha*(float)M_PI/180, glm::vec3(0, 1, 0));
cameraTransformation = glm::rotate(cameraTransformation, (float)beta*(float)M_PI/180, glm::vec3(1, 0, 0));

glm::vec4 cameraPosition = (cameraTransformation * glm::vec4(camX, camY, distance, 0));
glm::vec4 cameraUpDirection = cameraTransformation * glm::vec4(0, 1, 0, 0);

vMatrix = glm::lookAt(glm::vec3(cameraPosition[0],cameraPosition[1],cameraPosition[2]), glm::vec3((float)camX, (float)camY, 0.0), glm::vec3(cameraUpDirection[0],cameraUpDirection[1],cameraUpDirection[2]));

glm::mat4x4 mat =  glm::inverse(vMatrix) * glm::inverse(mMatrix) * glm::inverse(pMatrix);
glm::vec4 wSC = (mat) * glm::vec4(winX,winY,0,0);

在我的调整大小事件中,我的pMatrix预计如下:

pMatrix = glm::mat4x4(1.0);//sets identity
pMatrix = glm::perspective( (float)fov*(float)M_PI/180, (float) width / (float) height, (float)0.001, (float)10000 );

注意:过去我使用GLU库时遇到了问题,显然整体上使用了unProject函数,所以我选择自己执行计算.在这一点上它几乎是努力的理由,但我不打算使用预先存在的非投影函数期.

解决方法:

在我的光线拾取问题的最后阶段,我被告知我做了几件事:

>我在平面附近的窗口空间的z坐标应为-1,而不是0
>提醒我需要在相对的平面上使用2个单独的矢量,不要只使用1进行测试,通过实际的光线选择器运行它以查看它是否有效.
>使用“w”值1,而不是0.这是glm :: vec4 wSC =(mat)* glm :: vec4(winX,winY,0,0)的最后一个位置;线.
>我需要在执行任何计算之前将鼠标坐标转换为NDC坐标,因此这是:

>按屏幕宽度划分鼠标x,乘以2,减1.
>从屏幕高度减去鼠标y,除以屏幕高度,乘以2,减1:winX =((float)x / viewport [2] * 2)-1;
winY =((float)(viewport [3] -y)/ viewport [3] * 2)-1;

由于我的问题延长了很长一段时间,并且提出了几个问题,所以我非常感谢一些帮助我的人:

> srobins of facepunch,于this thread
> derhass from here,在这个问题上,这个discussion

标签:glm-math,projection,c,matrix,opengl
来源: https://codeday.me/bug/20191003/1848124.html