游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2297|回复: 4

关于frustum的实现,到底哪个才是正确的

[复制链接]

1

主题

5

帖子

5

积分

新手上路

Rank: 1

积分
5
发表于 2011-7-27 18:48:00 | 显示全部楼层 |阅读模式
参照planeExtraction.pdf。Directx的实现如下:

D3DXMATRIX WorldMatrix;
        D3DXMATRIX ViewMatrix;
        D3DXMATRIX ProjectMatrix;
        pD3DDevice->GetTransform( D3DTS_WORLD, &WorldMatrix );
        pD3DDevice->GetTransform( D3DTS_VIEW, &ViewMatrix );
        pD3DDevice->GetTransform( D3DTS_PROJECTION, &amprojectMatrix );

        D3DXMATRIX ComboMatrix;
        D3DXMatrixMultiply(&ComboMatrix, &WorldMatrix, &ViewMatrix);
        D3DXMatrixMultiply(&ComboMatrix, &ComboMatrix, &ProjectMatrix);
        //D3DXMatrixMultiply(&ComboMatrix, &ViewMatrix, &ProjectMatrix);

        // right clipping plane
        frustum[0][0] = ComboMatrix._14 - ComboMatrix._11;
        frustum[0][1] = ComboMatrix._24 - ComboMatrix._21;
        frustum[0][2] = ComboMatrix._34 - ComboMatrix._31;
        frustum[0][3] = ComboMatrix._44 - ComboMatrix._41;

        NormalizePlane(frustum, 0);

        // left clipping plane
        frustum[1][0] = ComboMatrix._14 + ComboMatrix._11;
        frustum[1][1] = ComboMatrix._24 + ComboMatrix._21;
        frustum[1][2] = ComboMatrix._34 + ComboMatrix._31;
        frustum[1][3] = ComboMatrix._44 + ComboMatrix._41;

        NormalizePlane(frustum, 1);

        // bottom clipping plane
        frustum[2][0] = ComboMatrix._14 + ComboMatrix._12;
        frustum[2][1] = ComboMatrix._24 + ComboMatrix._22;
        frustum[2][2] = ComboMatrix._34 + ComboMatrix._32;
        frustum[2][3] = ComboMatrix._44 + ComboMatrix._42;

        NormalizePlane(frustum, 2);

        // top clipping plane
        frustum[3][0] = ComboMatrix._14 - ComboMatrix._12;
        frustum[3][1] = ComboMatrix._24 - ComboMatrix._22;
        frustum[3][2] = ComboMatrix._34 - ComboMatrix._32;
        frustum[3][3] = ComboMatrix._44 - ComboMatrix._42;

        NormalizePlane(frustum, 3);

        // near clipping plane
        frustum[4][0] = ComboMatrix._13;
        frustum[4][1] = ComboMatrix._23;
        frustum[4][2] = ComboMatrix._33;
        frustum[4][3] = ComboMatrix._43;

        NormalizePlane(frustum, 4);

        // far clipping plane
        frustum[5][0] = ComboMatrix._14 - ComboMatrix._13;
        frustum[5][1] = ComboMatrix._24 - ComboMatrix._23;
        frustum[5][2] = ComboMatrix._34 - ComboMatrix._33;
        frustum[5][3] = ComboMatrix._44 - ComboMatrix._43;

        NormalizePlane(frustum, 5);

但我看网上很多人,包括一些网站里面写的d3d程序中 near clipping plane 是
frustum[4][0] = ComboMatrix._14 + ComboMatrix._13;
        frustum[4][1] = ComboMatrix._24 + ComboMatrix._23;
        frustum[4][2] = ComboMatrix._34 + ComboMatrix._33;
        frustum[4][3] = ComboMatrix._44 + ComboMatrix._43;

而参照planeExtraction.pdf中讲述的,opengl的实现方式才是如此,direct3d里面应该是
frustum[4][0] = ComboMatrix._13;
        frustum[4][1] = ComboMatrix._23;
        frustum[4][2] = ComboMatrix._33;
        frustum[4][3] = ComboMatrix._43;

我很迷惑,到底哪个是正确的?

10

主题

149

帖子

149

积分

注册会员

Rank: 2

积分
149
QQ
发表于 2011-7-27 19:28:00 | 显示全部楼层

Re:关于frustum的实现,到底哪个才是正确的

从裁剪空间中反推过来不就行了?

1

主题

5

帖子

5

积分

新手上路

Rank: 1

积分
5
 楼主| 发表于 2011-7-27 20:30:00 | 显示全部楼层

Re:关于frustum的实现,到底哪个才是正确的

我刚调试来测试了一下,planeExtraction.pdf中的才是正确的。岂不是网上很多人都用了错误的?

请问下,从裁剪空间,怎么反推啊,能不能详细说一下。

10

主题

149

帖子

149

积分

注册会员

Rank: 2

积分
149
QQ
发表于 2011-7-28 10:17:00 | 显示全部楼层

Re: Re:关于frustum的实现,到底哪个才是正确的

lb999255: Re:关于frustum的实现,到底哪个才是正确的

我刚调试来测试了一下,planeExtraction.pdf中的才是正确的。岂不是网上很多人都用了错误的?

请问下,从裁剪空间,怎么反推啊,能不能详细说一下。


自己查资料,连渲染管线都不懂,整天引擎引擎引你个头啊

0

主题

1

帖子

0

积分

新手上路

Rank: 1

积分
0
发表于 2011-7-31 23:19:00 | 显示全部楼层

Re: 关于frustum的实现,到底哪个才是正确的

建议LZ找一本3D数学的书看看,而不是依靠猜测和测试,搞懂理论才能举一反三。
推荐你一本吧:Mathematics for 3D Game Programming and Computer Graphics
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-6-8 12:06

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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