游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2030|回复: 0

紧急求解:基于OpenGL的AABB视截体裁剪

[复制链接]

11

主题

28

帖子

28

积分

注册会员

Rank: 2

积分
28
发表于 2008-5-11 23:43:00 | 显示全部楼层 |阅读模式
GLvoid OpenGL::Render() const
{
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);            // 清除屏幕和深度缓存
        glMatrixMode(GL_MODELVIEW);  // 选择模型观察矩阵
        glLoadIdentity();        // 重置当前的模型观察矩阵

        glPushMatrix();          // 保存当前模型观察矩阵

        // 设置照相机视野
        GlobalCamera.SetCameraView();

        // 计算照相机的平截头体
        GlobalCamera.CaculateFrustum();

        // 绘制模型
        glPushMatrix();     // 保存当前模型观察矩阵

        // 重置当前的模型观察矩阵
        glLoadIdentity();                                                                               
        // 偏移到指定位置
        glTranslatef(m_MD2Model.GetPosition().x, m_MD2Model.GetPosition().y, m_MD2Model.GetPosition().z);
        // 旋转
        glRotatef(90.0f, -1.0f, 0.0f, 0.0f);
        glRotatef(-90.0f, 0.0f, 0.0f, 1.0f);
        // 自定义旋转
        glRotatef(g_fRotate, 0.0f, 0.0f, 1.0f);

        // 计算照相机的平截头体
        GlobalCamera.CaculateFrustum();

        // 计算模型AABB
        m_MD2Model.CaculateAABB(m_MD2Model.GetCurrentRenderFrame());
        // 变换模型AABB
        m_MD2Model.TransformAABB();

        // 检测模型的可见性
        if (GlobalCamera.GetFrustum().IsAABBVisiable( m_MD2Model.GetAABB() ) == GL_TRUE)
        {
                // 绘制动作
                m_MD2Model.RenderModelAction(g_ActionType, g_fAddPercent, 0);
                // 绘制MD2模型
                //m_MD2Model.RenderFrame(0);
                ++g_uiRenderModelNumber;        // 计数绘制的模型数
        }

        glPopMatrix();            // 恢复模型观察矩阵

        // 绘制模型的AABB
        m_MD2Model.RenderAABB();

        glPopMatrix();        // 恢复模型观察矩阵
}

请问:为什么这段代码并没能对模型对象进行正确的AABB视截体剔除?仔细思考了很久,改了又改,可是还是不对.
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-1-22 12:57

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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