Ale*_*lex 9 3d geometry camera projection perspective
我正在用Java编写我自己的软件光栅化器,我遇到了一些问题...请看一下示例图片,请:
此示例仅在平面上绘制简单的方形网格.一切正常,直到我移动相机足够接近某些点移动它.之后,正如您所看到的那样,它们不再正确投影(垂直线 - 应该在摄像机后面的点投影在屏幕顶部).
我的转换矩阵和向量与DirectX使用的相同(PerspectiveFovLH用于投影,LookAtLH用于相机).
我正在使用以下转换方法来投射3D点:
之后,使用以下方法将点转换为屏幕:
// 'vector' is input vector in projection space
// projection to screen
double vX = vector.x / vector.z;
double vY = vector.y / vector.z;
//translate
//surfaceW is width and surfaceH is height of the rendering window.
vX = (( vX + 1.0f) / 2.0f) * surfaceW;
vY = ((-vY + 1.0f) / 2.0f) * surfaceH;
return new Vector3(vX, vY, vector.z);
Run Code Online (Sandbox Code Playgroud)正如我之前所说,它可以正常工作,直到点移动到相机后面.事实上,我可以弄清楚当点位于相机后面时(通过在最终变换后测试它的Z值),但由于我正在绘制线条和其他基于线的对象,我不能只是跳过这一点.
然后我尝试根据MSDN上的Direct3D Transformation Pipeline文章设置我的转换管道.
不幸的是,我也没有任何运气(相同的结果),所以任何帮助都会受到高度赞赏,因为我有点卡在这一点上.
谢谢.
最诚挚的问候,Alex
您需要在3d空间中将线与前剪切平面相交并截断线,以便仅绘制可见的线段:
|
|
|
x------------+-----------o
|
|
| * - camera
|
|
|
clipping plane
Run Code Online (Sandbox Code Playgroud)
你有一条线xo在x剪裁平面前面和o后面.将此线与剪切平面相交以生成点+.你知道的x,并o可见,所以从画线x到+.
这样你就不会投射相机后面的点.
| 归档时间: |
|
| 查看次数: |
3607 次 |
| 最近记录: |