gpt4 book ai didi

java - 如何在给定任意相机的情况下转换光线?

转载 作者:行者123 更新时间:2023-12-01 16:09:48 24 4
gpt4 key购买 nike

我正在编写一个光线追踪器(使用左手坐标,如果这有什么不同的话)。这是为了自学原理,所以我还没有使用 OpenGL 或景深等复杂功能。我的相机可以有任意位置和方向;我通过三个 vector 来表示它们:locationlook_atsky,其行为类似于 equivalent POV-Ray vectors 。它的“胶片”也有宽度高度。 (焦距长度由positionlook_at的距离表示。)

我的问题是不知道如何转换光线。我有两个量,vxvy,它们指示光线应该结束的位置。它们的变化范围都是从 -1 到 1。如果它们都是 -1,我会将光线从相机位置转换到“胶片”的左上角;如果它们都是 -1,我会将光线从相机位置转换到“胶片”的左上角;如果都是1,则右下角;如果都为 0,则为中心;其余的都是显而易见的。

我对 vector 算术不够熟悉,无法推导出射线方程。我希望能得到有关如何操作的解释。

最佳答案

您已经很好地描述了需要完成的工作。您的视野取决于您的相机和您要转换光线的“胶片”之间的距离。相机距离胶片越远,视野就越窄。

将胶片想象为相机指向的位图图像。假设我们将相机放置在距离位图一个单位的位置。然后我们必须通过位图的每个像素转换光线。

这个 vector 非常简单。如果我们将相机位置设置为 (0,0,0),位图胶片就在它前面,中心位于 (0,0,1),那么右下角的光线为 - tada - (1, 1,1),左下角的是(-1,1,1)。

这意味着右下角和左下角之间的差是(2,0,0)。

假设您的水平位图分辨率应为 1000,那么您可以按如下方式迭代底线像素:

width = 1000;
cameraToBottomLeft = (-1,1,1);
bottomLeftToBottomRight = (2,0,0);

for (x = 0; x < width; x++) {
ray = cameraToBottomLeft + (x/width) * bottomLeftToBottomRight;
...
}

如果这是清楚的,那么您只需为您的线条添加一个等效的外部循环,并且您就拥有了您需要的所有光线。

然后,您可以为相机到胶片的距离以及水平和垂直分辨率添加适当的变量。完成后,您可以开始使用矩阵变换来更改外观 vector 和向上 vector 。

如果您想深入了解计算机图形学, introductory textbook可能会有很大的帮助。我用过this one在大学时,我想我喜欢它。

关于java - 如何在给定任意相机的情况下转换光线?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1699214/

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