从2D点计算单位球面上的3D坐标

Wil*_*ill 5 math graphics geometry

我有一个圆形的方形位图,我想计算该圆中所有像素的法线,就好像它是一个半径为1的球体:

在此输入图像描述

球体/圆圈在位图中居中.

这个等式是什么?

Tom*_*ych 8

不太了解人们如何编写3D内容,所以我只是给出纯数学并希望它有用.

半径为1的球体,以原点为中心,是满足以下条件的点集:

x 2 + y 2 + z 2 = 1

我们想要球体上一个点的3D坐标,其中x和y是已知的.所以,只需解决z:

z =±sqrt(1 - x 2 - y 2).

现在,让我们考虑从球体向外指向的单位向量.它是一个单位球体,所以我们可以使用从原点到(x,y,z)的矢量,当然,它是<x,y,z>.

现在我们想要一个与球体在(x,y,z)相切的平面方程,但是这将使用它自己的x,y和z变量,所以相反我将使它与球体相切(x)0,y 0,z 0).这很简单:

x 0 x + y 0 y + z 0 z = 1

希望这可以帮助.


(OP):

你的意思是:

const int R = 31, SZ = power_of_two(R*2);
std::vector<vec4_t> p;
for(int y=0; y<SZ; y++) {
    for(int x=0; x<SZ; x++) {
        const float rx = (float)(x-R)/R, ry = (float)(y-R)/R;
        if(rx*rx+ry*ry > 1) { // outside sphere
            p.push_back(vec4_t(0,0,0,0));
        } else {
            vec3_t normal(rx,sqrt(1.-rx*rx-ry*ry),ry);
            p.push_back(vec4_t(normal,1));
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

如果我将法线视为颜色并将其视为blit,它确实会形成一个漂亮的球形着色阴影; 这样对吗?


(TZ)

对不起,我不熟悉C++的这些方面.最近没有使用过这门语言.