• 大小: 576KB
    文件类型: .7z
    金币: 1
    下载: 0 次
    发布日期: 2021-05-07
  • 语言: 其他
  • 标签: 3DS  OpenGL  

资源简介

学习了Blender之后,很想将自己设计的模型载入自己编写的程序中,因此考虑了比较常见的3DS文件格式。这回尝试着将3DS文件载入自己写的OpenGL程序并且显示出来。 首先查找了许多现成载入3DS格式的例子,发现只有一个程序是可以运行的,于是就拿这个程序的源代码进行研究。同时查看了一些国外的格式说明文档,结合Blender中Outliner中数据的组织,我开始了解3DS格式的组织方式。

资源截图

代码片段和文件信息

#include 
#include “Camera.h“
//-----------------------------------------------------------------------------
Camera::Camera( void )
{
    m_Pos.Set( 0.0f 0.0f 0.0f );      // 我默认在原点
    m_Forward.Set( 0.0f 0.0f -1.0f ); // 我向Z轴负半轴看
    m_Upward.Set( 0.0f 1.0f 0.0f );   // Y轴正半轴是上
}
//-----------------------------------------------------------------------------
void Camera::SetPos( const Point3F& pos )
{
    m_Pos = pos;
}
//-----------------------------------------------------------------------------
void Camera::SetForward(const Vector3F& forward )
{
    m_Forward = forward;
}
//-----------------------------------------------------------------------------
void Camera::SetUpward( const Vector3F& upward )
{
    m_Upward = upward;
}
//-----------------------------------------------------------------------------
void Camera::MoveForward( const float step )
{
    m_Pos += m_Forward * step;
}
//-----------------------------------------------------------------------------
void Camera::Apply( void )
{
    // 默认是自己建立一个矩阵并且设置的,但是glu提供的函数会更快。
    // 不过为了学习有关矩阵的知识,还是使用自己的变换吧
    float matrix[16];

    // 首先获取照相机观察和向上向量生成的矩阵
    Vector3F x &y = m_Upward z;
    z = -m_Forward;
    CrossProduct( &x y z );
#define MATRIX( row col ) matrix[ row * 4 + col ]// 临时定义的宏
    MATRIX( 0 0 ) = x.m[0];
    MATRIX( 1 0 ) = x.m[1];
    MATRIX( 2 0 ) = x.m[2];
    MATRIX( 3 0 ) = 0.0f;
    MATRIX( 0 1 ) = y.m[0];
    MATRIX( 1 1 ) = y.m[1];
    MATRIX( 2 1 ) = y.m[2];
    MATRIX( 3 1 ) = 0.0f;
    MATRIX( 0 2 ) = z.m[0];
    MATRIX( 1 2 ) = z.m[1];
    MATRIX( 2 2 ) = z.m[2];
    MATRIX( 3 2 ) = 0.0f;
    MATRIX( 0 3 ) = 0.0f;
    MATRIX( 1 3 ) = 0.0f;
    MATRIX( 2 3 ) = 0.0f;
    MATRIX( 3 3 ) = 1.0f;
#undef MATRIX

    // 设置矩阵
    glMultMatrixf( matrix );

    // 移动模型视图矩阵
    glTranslatef( -m_Pos.x -m_Pos.y -m_Pos.z );
}
//-----------------------------------------------------------------------------
void Camera::RotateX( float angleInRadius )
{
    // X轴(所谓的)是由向上向量(Y轴)和向前向量(Z轴)叉积得到的
    Vector3F vecX;
    CrossProduct( &vecX m_Upward m_Forward );

    float rotMatrix[16];
    RotationMatrix( rotMatrix vecX angleInRadius );// 计算旋转矩阵

    // 更新向前的向量和向上的向量,将矩阵的3x3部分和向前和向上的向量相乘
    Vector3F tmpVec;
    tmpVec.Set( rotMatrix[0] * m_Forward.x + rotMatrix[4] * m_Forward.y + rotMatrix[8] * m_Forward.z
            rotMatrix[1] * m_Forward.x + rotMatrix[5] * m_Forward.y + rotMatrix[9] * m_Forward.z
            rotMatrix[2] * m_Forward.x + rotMatrix[6] * m_Forward.y + rotMatrix[10] * m_Forward.z );
    m_Forward = tmpVec;

    tmpVec.Set( rotMatrix[0] * m_Upward.x + rotMatrix[4] * m_Upward.y + rotMatrix[8] * m_Upward.z
            rotMatrix[1] * m_Upward.x + rotMatrix[5] * m_Upward.y + rotMatrix[9] * m_Upward.z
            rotMatrix[2] * m_Upward.x + rotMatrix[6] * m_Upward.y + rotMatrix[10] * m_Upward.z );
    m_Upward = tmpVec;
}
//-----------------------------------------------------------------------------
void Camera::RotateY( floa

评论

共有 条评论