⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 camera.cpp

📁 x3d_new.rar
💻 CPP
字号:
#include "StdAfx.h"
#include ".\camera.h"

CCamera::CCamera(void)
    : m_pDevice(NULL)
    ,m_vUp(0.0f, 1.0f, 0.0f)
{
}

CCamera::~CCamera(void)
{
}

// 位置
void CCamera::SetPosition(LPD3DXVECTOR3 pvPos)
{
    m_vPosition = *pvPos;
    ApplyChange();
}

// 目标
void CCamera::SetTarget(LPD3DXVECTOR3 pvTarget, bool bUpReset /*= true*/)
{
    if(bUpReset)
    {
        m_vUp.x = 0.0f;
        m_vUp.y = 1.0f;
        m_vUp.z = 0.0f;
    }

    m_vTarget = *pvTarget;
    ApplyChange();
}

// 前进(后退)
void CCamera::GotoDest(float fDistance)
{
    D3DXVECTOR3 vDir = GetDirection();
    m_vPosition += vDir * fDistance;
    SetDirection(&vDir);
}

// 侧移
void CCamera::Move(float fLeftRight, float fUpDown)
{        
    D3DXVECTOR3 vDir = GetDirection();

    if(fLeftRight < -0.00001f || fLeftRight > 0.000001f)
    {    
        D3DXVECTOR3 vAxis;
        D3DXVec3Cross(&vAxis, &m_vUp, &vDir);
        m_vPosition += vAxis * fLeftRight;
    }

    if(fUpDown < -0.00001f || fUpDown > 0.000001f)
    {
        m_vPosition += m_vUp * fUpDown;
    }        
    
    SetDirection(&vDir);
}

// 方向
void CCamera::SetDirection(LPD3DXVECTOR3 pvDir)
{
    // 根据方向确定目标
    //D3DXVECTOR3 vDir = *pvDir;

    //D3DXMATRIX matTemp(1.f, 0.f, 0.f, 0.f,
    //                    0.f, 1.f, 0.f, 0.f,
    //                    0.f, 0.f, 1.f, 0.f,
    //                    vDir.x, vDir.y, vDir.z, 1.f);

    //D3DXVec3TransformCoord(&m_vTarget, &m_vPosition, &matTemp);
    m_vTarget = m_vPosition + *pvDir;

    // 设置摄像机
    ApplyChange();
}

void CCamera::ApplyChange()
{
    assert(m_pDevice);

    // LookAt
    D3DXMATRIX matView;
    D3DXMatrixLookAtLH(&matView, 
        &m_vPosition,
        &m_vTarget,
        &m_vUp);

    m_pDevice->SetTransform(D3DTS_VIEW, &matView);
}

void CCamera::Rotate(float fYaw /*= 0.0f*/, float fPitch /*= 0.0f*/, float fRoll /*= 0.0f*/, bool bForceUp /*= true*/)
{
    // Yaw
    if(fYaw < -0.00001f || fYaw > 0.000001f)
    {
        D3DXMATRIX matRotate;

        if(bForceUp)
        {            
            D3DXMatrixRotationY(&matRotate, fYaw);        

            // vUp
            D3DXVec3TransformCoord(&m_vUp, &m_vUp, &matRotate);
        }
        else
        {
            D3DXMatrixRotationAxis(&matRotate, &m_vUp, fYaw);
        }

        // vTarget
        m_vTarget -= m_vPosition;
        D3DXVec3TransformCoord(&m_vTarget, &m_vTarget, &matRotate);
        m_vTarget += m_vPosition;
    }

    // Pitch
    if(fPitch < -0.00001f || fPitch > 0.000001f)
    {
        D3DXVECTOR3 vAxis;
        D3DXVec3Cross(&vAxis, &m_vUp, &(m_vTarget - m_vPosition));

        D3DXMATRIX matRotate;
        D3DXMatrixRotationAxis(&matRotate, &vAxis, fPitch);

        // vUp
        D3DXVec3TransformCoord(&m_vUp, &m_vUp, &matRotate);    

        // vTarget
        m_vTarget -= m_vPosition;
        D3DXVec3TransformCoord(&m_vTarget, &m_vTarget, &matRotate);
        m_vTarget += m_vPosition;
    }

    // Roll
    if(fRoll < -0.00001f || fRoll > 0.000001f)
    {
        // vUp
        D3DXMATRIX matRotate;
        D3DXMatrixRotationAxis(&matRotate, &(m_vTarget - m_vPosition), fRoll);
        D3DXVec3TransformCoord(&m_vUp, &m_vUp, &matRotate);
    }

    // 设置摄像机
    ApplyChange();
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -