所以我在3D空间中渲染点。为了在屏幕上找到他们的X位置,我使用了这个数学:
double sin = Math.sin(viewPointRotX);
double cos = Math.cos(viewPointRotX);
double xx = x - viewPointX;
double zz = z - viewPointZ;
double rotx = xx * cos - zz * sin;
double rotz = zz * cos + xx * sin;
double xpix = (rotx / rotz * height + width / 2);
我正在为Y做一个类似的过程。
这样可以正常工作,但是当它们实际位于相机后面时,它们可以呈现为好像它们位于相机前面。
如何使用我得知的数据是否在相机的前面或后面?
答案 0 :(得分:0)
我们可以通过比较坐标和一点3D坐标几何来判断一个点是在摄像机的前面还是后面。
考虑一个非常简单的例子:摄像机位于(0,0,0)并指向上方。这意味着具有正Z坐标的每个点都在相机的“前方”。现在,我们可以变得更加复杂并且考虑到相机的视野实际上是具有特定角度的圆锥的事实。
例如,如果摄像机具有90度视野(在其面向的两个方向上为45度),那么我们可以通过一些线性数学处理这个。在2D空间中,同样在原点处的相机朝上,视野将由线y = x和y = -x(或y = | x |内的所有点)约束。
对于3D空间,取y = x线并围绕z轴旋转。我们现在有锥形:
z = x*x + y*y
,所以如果
if(z < x*x + y*y && z>0)
then the point is in front of the camera and within the field of view.
如果相机不在原点,我们可以只转换坐标系,然后运行上面的计算。如果视角不是90度,那么我们需要找出一些线y = mx(其中m = Math.tan(viewAngle/2)
)并围绕z轴旋转这条线以获得光锥。
答案 1 :(得分:0)
您正在执行此操作的方式是转换点坐标,以便它们与视图对齐并相对于视图。
如果以正确的方式执行此操作,则可以检查旋转的z值是否为正且大于从焦点到镜头的距离&#34;。
找到视图方向向量:
V = (cos(a)sin(b), sin(a)sin(b), cos(b))
,其中a和b是相机的旋转角度。
将偏移矢量(xx, yy, zz)
投影到视图方向矢量上,找到幅度,给出相机在该点的视轴之间的距离:
distance = xx * cos(a)sin(b) + yy * sin(a)sin(b) + zz * cos(b)
现在只需检查distance > focalLength
。
这应该可行,但你必须小心设置一切正确。您可能必须使用不同的计算来查找视图方向向量,具体取决于您如何表示相机的方向。