Java 光线跟踪器基于摄影机角度扭曲立方体?

Java 光线跟踪器基于摄影机角度扭曲立方体?,java,raytracing,Java,Raytracing,从本质上讲,发生的是我的光线跟踪器渲染的3D立方体出现了一些奇怪的扭曲,随着摄影机向上移动,这种扭曲会继续恶化,即使立方体在屏幕上的相同位置也是如此 代码在 以下是输出的图片: 编辑:问题解决了,因为我只是错误地计算了向量的角度。我找到的最好的方法是根据FOV(Z)当前像素X和当前像素Y创建一个向量,然后对该向量进行规格化。看起来你是在根据Euler角度计算光线投射,而不是通常的投影 通常,对“3D”相机进行建模,使相机位于光线通过网格投影的点上,网格与相机相距一定距离。。。顺便说一句,这就像

从本质上讲,发生的是我的光线跟踪器渲染的3D立方体出现了一些奇怪的扭曲,随着摄影机向上移动,这种扭曲会继续恶化,即使立方体在屏幕上的相同位置也是如此

代码在

以下是输出的图片:


编辑:问题解决了,因为我只是错误地计算了向量的角度。我找到的最好的方法是根据FOV(Z)当前像素X和当前像素Y创建一个向量,然后对该向量进行规格化。

看起来你是在根据Euler角度计算光线投射,而不是通常的投影

通常,对“3D”相机进行建模,使相机位于光线通过网格投影的点上,网格与相机相距一定距离。。。顺便说一句,这就像看着一个离你的脸有一定距离的显示器,然后通过显示器的每个像素投射光线

在固定的情况下,计算在概念上很简单。。e、 g

double pixelSpacing = 0.005;
double screenDistance = 0.7;
for (int yIndex= -100; yIndex<= 100; yIndex++)
    for (int xIndex= -100; xIndex<= 100; xIndex++) {
        Vector3 ray = new Vector3(
           xIndex * pixelSpacing,
           yIndex * pixelSpacing,
           screenDistance
        );
        ray = vec.normalize();
        // And 'ray' is now a vector with our ray direction
    }
双像素间距=0.005;
双屏距=0.7;

对于(int-yIndex=-100;yIndex来说,看起来您是基于欧拉角而不是通常的投影来计算要投射的光线

通常,对“3D”相机进行建模,使相机位于一个点上,光线通过与其相距一定距离的网格投射……顺便说一句,这与观看距离脸部一定距离的显示器并通过显示器的每个像素投射光线完全一样

在固定的情况下,计算在概念上很简单

double pixelSpacing = 0.005;
double screenDistance = 0.7;
for (int yIndex= -100; yIndex<= 100; yIndex++)
    for (int xIndex= -100; xIndex<= 100; xIndex++) {
        Vector3 ray = new Vector3(
           xIndex * pixelSpacing,
           yIndex * pixelSpacing,
           screenDistance
        );
        ray = vec.normalize();
        // And 'ray' is now a vector with our ray direction
    }
双像素间距=0.005;
双屏距=0.7;

对于(int-yIndex=-100;yIndex我建议发布输出的屏幕截图或图像捕获。我不能。我只是建立了这个帐户,而且我的声誉太低。@user5220832,谢谢!另外,尝试将代码内联,人们不喜欢点击链接,更容易相信答案下面的代码没有改变。这是rotati的典型错误ng cubes的作用类似于
x=x*cos(角度)+y*sin(角度);y=x*sin(角度)-y*cos(角度)
,没有意识到第二条语句中的
x
已经更新。这导致立方体逐渐变平,但我不知道你的情况是否如此。我建议发布输出的屏幕截图或图像捕获。我不能。我只是创建了这个帐户,我的声誉太低。@user5220832,比另外,试着将代码内联,人们不喜欢点击链接,而且更容易相信答案下面的代码没有改变。旋转立方体的典型错误是执行类似于
x=x*cos(角度)+y*sin(角度);y=x*sin(角度)-y*cos(角度)的操作
,没有意识到第二条语句中的
x
已经更新。这导致立方体逐渐变平,但我不知道您的情况是否如此。