游戏开发论坛

 找回密码
 立即注册
搜索
查看: 3103|回复: 7

如何确定摄像机的可视体(View Volume)的8个顶点的坐标

[复制链接]

64

主题

855

帖子

856

积分

高级会员

Rank: 4

积分
856
QQ
发表于 2005-5-12 09:59:00 | 显示全部楼层 |阅读模式
已知透视投影中:
  Near = 1.0f;
  Far = 1000.0f;
  纵横比 = 1.0f;
  观察范围夹角 = D3DX_PI / 2;   //90度

  眼睛位于(X_Eye, Y_Eye, Z_Eye)
  观察点位于(X_Look, Y_Look, Z_Look)
  上方向为(X_Up, Y_Up, Z_Up)

我想求出构成ViewVolume的8个顶点坐标,请问一下用什么方法好呢?给个思路也行啊。

64

主题

855

帖子

856

积分

高级会员

Rank: 4

积分
856
QQ
 楼主| 发表于 2005-5-12 10:01:00 | 显示全部楼层

Re:如何确定摄像机的可视体(View Volume)的8个顶点的坐标

我目前是先求出观察射线的变换矩阵,再将该矩阵作用于未变换的视体,好像不是很好

2

主题

85

帖子

85

积分

注册会员

Rank: 2

积分
85
发表于 2005-5-12 14:19:00 | 显示全部楼层

Re:如何确定摄像机的可视体(View Volume)的8个顶点的坐标

看看这样行不行(:

眼睛向量:EYE
观察点:LOOK
上方向:UP (单位向量)
前向量:FRONT = normalize(Look-Eye);
右向量:RIGHT = UP X FRONT

近四点: near * ( FRONT +- UP*tan(fovy/2) +- RIGHT* tan(fovx/2) )
远四点: far * ( FRONT +- UP*tan(fovy/2) +- RIGHT* tan(fovx/2) )

64

主题

855

帖子

856

积分

高级会员

Rank: 4

积分
856
QQ
 楼主| 发表于 2005-5-12 17:11:00 | 显示全部楼层

Re:如何确定摄像机的可视体(View Volume)的8个顶点的坐标

谢谢,我仔细看看

0

主题

2

帖子

0

积分

新手上路

Rank: 1

积分
0
发表于 2005-5-12 22:15:00 | 显示全部楼层

Re: 如何确定摄像机的可视体(View Volume)的8个顶点的坐标

视景体(View Frustum)经过观察矩阵和投影矩阵变换后,会成为一个半正立方体(顶点坐标见下程序)。这个过程的逆过程可以用来求出在世界坐标系下的视景体坐标:
    //pMatView 观察矩阵
    //pMatProj 投影矩阵
    D3DXMATRIX mat;

    // 变换的逆矩阵
    D3DXMatrixMultiply( &mat, pMatView, pMatProj );
    D3DXMatrixInverse( &mat, NULL, &mat );

   //视景体的八个顶点坐标(正立方体)
    viewFrustum.vecFrustum[0] = D3DXVECTOR3(-1.0f, -1.0f,  0.0f); // xyz
    viewFrustum.vecFrustum[1] = D3DXVECTOR3( 1.0f, -1.0f,  0.0f); // Xyz
    viewFrustum.vecFrustum[2] = D3DXVECTOR3(-1.0f,  1.0f,  0.0f); // xYz
    viewFrustum.vecFrustum[3] = D3DXVECTOR3( 1.0f,  1.0f,  0.0f); // XYz
    viewFrustum.vecFrustum[4] = D3DXVECTOR3(-1.0f, -1.0f,  1.0f); // xyZ
    viewFrustum.vecFrustum[5] = D3DXVECTOR3( 1.0f, -1.0f,  1.0f); // XyZ
    viewFrustum.vecFrustum[6] = D3DXVECTOR3(-1.0f,  1.0f,  1.0f); // xYZ
    viewFrustum.vecFrustum[7] = D3DXVECTOR3( 1.0f,  1.0f,  1.0f); // XYZ

    //变换为世界坐标系,8个顶点坐标求出
    for( int i = 0; i < 8; i++ )
        D3DXVec3TransformCoord( &viewFrustum.vecFrustum, &viewFrustum.vecFrustum, &mat );

22

主题

274

帖子

274

积分

中级会员

Rank: 3Rank: 3

积分
274
发表于 2005-5-13 10:44:00 | 显示全部楼层

Re:如何确定摄像机的可视体(View Volume)的8个顶点的坐标

其实ERICZHOU求得的点在VIEW空间,如果WORLD MATRIX不是单位阵,把上边变换MATRIX在之前多乘一个WOLRD MATRIX,就能得到WORLD空间FRUSTUM的8点了.

64

主题

855

帖子

856

积分

高级会员

Rank: 4

积分
856
QQ
 楼主| 发表于 2005-5-13 11:20:00 | 显示全部楼层

Re:如何确定摄像机的可视体(View Volume)的8个顶点的坐标

WORLD MATRIX不是单位阵这个是什么意思?moremoretime您说的WorldMatrix指什么?

2

主题

85

帖子

85

积分

注册会员

Rank: 2

积分
85
发表于 2005-5-13 14:56:00 | 显示全部楼层

Re:如何确定摄像机的可视体(View Volume)的8个顶点的坐标

矩阵求逆+矩阵乘法+8次矩阵向量乘法,代价有点高噢。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-20 07:15

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表