Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 十、 半圆柱体的Y位置-光线-三角形-到空间的交点[-1,1][-1,1]_C++_Opengl_Graphics_3d_Raytracing - Fatal编程技术网

C++ 十、 半圆柱体的Y位置-光线-三角形-到空间的交点[-1,1][-1,1]

C++ 十、 半圆柱体的Y位置-光线-三角形-到空间的交点[-1,1][-1,1],c++,opengl,graphics,3d,raytracing,C++,Opengl,Graphics,3d,Raytracing,我正在将平铺贴图渲染到fbo,然后将生成的缓冲区移动到纹理,并在FSQ上进行渲染。然后从鼠标点击事件中,我得到了屏幕坐标,并将它们移动到剪辑空间[-1,1]: glm::vec2 posMouseClipSpace((2.0f * myCursorPos.x) / myDeviceWidth - 1.0f, 1.0f - (2.0f * myCursorPos.y) / myDeviceHeight); 我的程序中有逻辑,基于这些坐标,它在纹理上选

我正在将平铺贴图渲染到fbo,然后将生成的缓冲区移动到纹理,并在FSQ上进行渲染。然后从鼠标点击事件中,我得到了屏幕坐标,并将它们移动到剪辑空间[-1,1]:

    glm::vec2 posMouseClipSpace((2.0f * myCursorPos.x) / myDeviceWidth - 
                 1.0f, 1.0f - (2.0f *  myCursorPos.y) / myDeviceHeight);
我的程序中有逻辑,基于这些坐标,它在纹理上选择一个特定的瓷砖

现在,转到3D,我正在使用上一步中使用的FBO对半圆柱体进行纹理处理:

在本例中,我使用的是一个射线三角形交点,它以半径r和高度h撞击圆柱体。想法是将这个交点移动到空间[-1,1],这样我就可以在程序中保留逻辑来选择瓷砖

我使用Möller–Trumbore算法检查被光线击中的圆柱体上的点。假设相交点是(x,y)(不确定该点是在三角形、对象还是世界空间中。显然,它是世界空间)。 我想把这个点转换成空间x:[-1,1],y[-1,1]

我知道圆柱体的高度,即圆柱体弧长的四分之一:

气缸高度=My半径*(PI/2)

因此Y轴上的点可以在[-1,1]空间中设置:

vec2.y = (2.f * (intersectedPoint.y - myCylinder->position().y) ) / 
         (myCylinder->height()) - 1.f
这是完美的

但是,如何计算依赖于两个变量x和z的水平轴

目前,我的圆柱体的半径是1,所以巧合的是,在原点设置的半圆柱体将从X轴上的(-1,1)开始,这使我认为它是[-1,1]空间,但事实并非如此。 我的下一个方法是使用半圆的弧长s=r*PI,然后将该值插入方程:

vec2.x = (2.f * (intersectedPoint.x - myCylinder->position().x) ) / 
             (myCylinder->arcLength()) - 1.f
但很明显,它在负方向上偏离了1个单位


非常感谢您的帮助。

根据您的描述,您似乎希望将世界空间交点坐标转换为其相应的规格化纹理坐标

为此,还需要Z坐标,因为必须有两个“水平”坐标。但是,您不需要弧长

使用相交点的相对X和Z坐标,使用atan2计算极角,并除以PI(半圆弧的角度范围):


这不是一个数学问题而不是一个编程问题吗?如果圆柱体是三维的,那么交点怎么可能是二维的?你是指Möller–Trumbore计算的参数坐标(在许多实现中称为
u,v
s,t
)吗?@meowgoesthedog好的,交点在圆柱体的一条光线和一个三角形部分之间,因此它确实有3个坐标。但是,我能够将Y坐标转换为[-1,1],当它依赖于两个变量时,如何处理水平轴?@πάνταῥεῖ 我在数学交流论坛上问过,但没有帮助。我想试一试这一个这里有3个轴在三维。如果将“垂直”定义为Y轴,则有两个“水平”轴-X和Z。您可能会混淆3D空间和屏幕空间。可能包括一个图表,并给出示例坐标。它很有效!!我曾经尝试过使用atan2,但我从来没有放弃PI(noob问题)。因为我的圆柱体位于负z轴上,所以我必须交换等式中的坐标并乘以2,因为帧缓冲区对象的宽度是原始视口的两倍。@Camilo啊,好的,可能是不同的规范化方案(在图形编程中经常发生)
vec2.x = atan2(intersectedPoint.z - myCylinder->position().z,
               myCylinder->position().x - intersectedPoint.x) / PI;