游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2241|回复: 5

旋转物体的问题!!

[复制链接]

3

主题

11

帖子

15

积分

新手上路

Rank: 1

积分
15
发表于 2007-8-18 14:25:00 | 显示全部楼层 |阅读模式
我用鼠标拖动使摄像机绕着物体旋转,但在旋转过程中为什么会离物体越来越近啊,
我看了下相机坐标和目标坐标,发现距离变小了,难道是计算过程中的误差积累?
就高人指点
D3DXMATRIX    matRotation;//
        D3DXMatrixIdentity(&matRotation);
        D3DXVECTOR3   RotationAxis;
        RotationAxis.x                    =matCameraView._11;
        RotationAxis.y                    =matCameraView._21;
        RotationAxis.z                    =matCameraView._31;
        //D3DXMatrixRotationY(&matRotation,x/RADIAN_TO_DEGREES);
        D3DXMatrixRotationAxis(&matRotation,& RotationAxis,x/RADIAN_TO_DEGREES);

       
        D3DXMatrixLookAtLH(&matCameraView,VecMulMATRIX(&vecCameraSource,&matRotation),&vecCameraTarget,VecMulMATRIX(&viewUp,&matRotation));

        pD3DDevice->SetTransform(D3DTS_VIEW,&matCameraView);

D3DXVECTOR3* VecMulMATRIX(D3DXVECTOR3* vec,D3DXMATRIX*  matrix)
{
        vec->x=vec->x*matrix->_11+vec->y*matrix->_21+vec->z*matrix->_31+matrix->_41;
        vec->y=vec->x*matrix->_12+vec->y*matrix->_22+vec->z*matrix->_32+matrix->_42;
        vec->z=vec->x*matrix->_13+vec->y*matrix->_23+vec->z*matrix->_33+matrix->_43;
       
        return vec;
}
[em24]

3

主题

11

帖子

15

积分

新手上路

Rank: 1

积分
15
 楼主| 发表于 2007-8-19 11:31:00 | 显示全部楼层

Re:旋转物体的问题!!

??????

2

主题

429

帖子

435

积分

中级会员

Rank: 3Rank: 3

积分
435
发表于 2007-8-19 18:18:00 | 显示全部楼层

Re:旋转物体的问题!!

VecMulMATRIX ??  怎么不用D3DXVec3TransformCoord

RotationAxis赋值那儿 是指相机的x轴?

0

主题

769

帖子

1052

积分

金牌会员

Rank: 6Rank: 6

积分
1052
发表于 2007-8-19 20:24:00 | 显示全部楼层

Re:旋转物体的问题!!

我旋转镜头的方法是学<DIRECTX角色扮演游戏>那本书用的,就是把摄像机分为由两个点来控制
一个是相机的位置的点,一个是镜头对着的点,我觉得这种方法可以把镜头旋转等问题简化掉
BOOL cCamera:oint(float XEye, float YEye, float ZEye, float XAt, float YAt, float ZAt)
{
  float XRot, YRot, XDiff, YDiff, ZDiff;

  // Calculate angles between points
  XDiff = XAt - XEye;
  YDiff = YAt - YEye;
  ZDiff = ZAt - ZEye;
  XRot = (float)atan2(-YDiff, sqrt(XDiff*XDiff+ZDiff*ZDiff));
  YRot = (float)atan2(XDiff, ZDiff);

  Move(XEye, YEye, ZEye);
  Rotate(XRot, YRot, 0.0f);

  return TRUE;
}

3

主题

11

帖子

15

积分

新手上路

Rank: 1

积分
15
 楼主| 发表于 2007-8-20 21:43:00 | 显示全部楼层

Re: Re:旋转物体的问题!!

Enigmaya: Re:旋转物体的问题!!

VecMulMATRIX ??  怎么不用D3DXVec3TransformCoord

RotationAxis赋值那儿 是指相机的x轴?


VecMulMATRIX 自定义的功能一样的啊
我的意思是想把他绕过原点且与相机局部坐标系的X轴平行的向量旋转

362

主题

3023

帖子

3553

积分

论坛元老

Rank: 8Rank: 8

积分
3553
发表于 2007-9-5 12:23:00 | 显示全部楼层

Re:旋转物体的问题!!

你这段代码是摄像机对巴,我有一个封装的很好的摄像机,送给你:
http://bbs.gameres.com/showthread.asp?postid=467279

//Camera.h

void Vec3MulMat(D3DXVECTOR3*,D3DXVECTOR3*,D3DXMATRIXA16*);//向量乘以矩阵
void CreateViewMat(D3DXMATRIX*,D3DXVECTOR3*,D3DXVECTOR3*,D3DXVECTOR3*,D3DXVECTOR3*);//建立视矩阵
void MoveOnAxis(D3DXVECTOR3*,D3DXVECTOR3*,D3DXVECTOR3*,float);//沿着某个轴移动
void RotateWithAxis(D3DXVECTOR3*,D3DXVECTOR3*,D3DXVECTOR3*,float);//围绕某个轴旋转
class CCamera
{
public:
CCamera(float,float,float);
CCamera(D3DXVECTOR3*,D3DXVECTOR3*,D3DXVECTOR3*);
void MoveByWorld(float,float,float);//按照世界坐标移动
void Move(float,float,float);//(沿着摄像机的3轴)移动
void SetPos(float,float,float);//设置摄像机的位置
D3DXVECTOR3 GetPos();//取得位置
void Rotate(float,float,float);//(围绕摄像机的3轴)旋转
void RotateByWorld(float,float,float);//围绕世界坐标系的轴旋转
D3DXMATRIX GetViewMat();//取得视变换的矩阵
private:
D3DXVECTOR3 m_Pos;
D3DXVECTOR3 m_Look;
D3DXVECTOR3 m_Up;
D3DXVECTOR3 m_Right;
void CheckRightUpLook();//重新归一化,正交化Look,Up,重新计算出Right.
};

//Camera.cpp

#pragma comment(lib,"d3d9.lib")
#pragma comment(lib,"d3dx9.lib")
#include <d3d9.h>
#include <d3dx9.h>
#include "Camera.h"

void Vec3MulMat(D3DXVECTOR3* ret,D3DXVECTOR3* v,D3DXMATRIX* m)
{
ret->x = v->x * m->_11 + v->y * m->_21 + v->z * m->_31;
ret->y = v->x * m->_12 + v->y * m->_22 + v->z * m->_32;
ret->z = v->x * m->_13 + v->y * m->_23 + v->z * m->_33;
}

void CreateViewMat(D3DXMATRIX* mat,D3DXVECTOR3* pos,D3DXVECTOR3* right,D3DXVECTOR3* up,D3DXVECTOR3* look)
{
mat->_11=right->x; mat->_12=up->x; mat->_13=look->x; mat->_14=0;
mat->_21=right->y; mat->_22=up->y; mat->_23=look->y; mat->_24=0;
mat->_31=right->z; mat->_32=up->z; mat->_33=look->z; mat->_34=0;
mat->_41=-D3DXVec3Dot(pos,right); mat->_42=-D3DXVec3Dot(pos,up); mat->_43=-D3DXVec3Dot(pos,look); mat->_44=1;
}

void CCamera::CheckRightUpLook()//还有另一种方法。。。
{
D3DXVec3Normalize(&m_Look,&m_Look);
m_Up=m_Up-m_Look*D3DXVec3Dot(&m_Up,&m_Look);
D3DXVec3Normalize(&m_Up,&m_Up);
D3DXVec3Cross(&m_Right,&m_Up,&m_Look);
}

void MoveOnAxis(D3DXVECTOR3* dest,D3DXVECTOR3* axis,D3DXVECTOR3* pos,float deltaS)
{
D3DXVECTOR3 tmp;
D3DXVec3Normalize(&tmp,axis);
*dest=tmp*deltaS+*pos;
}

void RotateWithAxis(D3DXVECTOR3* ret,D3DXVECTOR3* vec,D3DXVECTOR3* axis,float sita)
{
D3DXMATRIX mat;
D3DXMatrixRotationAxis(&mat,axis,sita);
Vec3MulMat(ret,vec,&mat);
}

D3DXVECTOR3 CCamera::GetPos()
{
return m_Pos;
}

void CCamera::MoveByWorld(float dx,float dy,float dz)
{
m_Pos.x+=dx;m_Pos.y+=dy;m_Pos.z+=dz;
}

void CCamera::SetPos(float x,float y,float z)
{
m_Pos.x=x;m_Pos.y=y;m_Pos.z=z;
}

void CCamera::RotateByWorld(float x,float y,float z)
{
D3DXMATRIX mat;
if(x)
{
D3DXMatrixRotationX(&mat,x);
Vec3MulMat(&m_Look,&m_Look,&mat);
Vec3MulMat(&m_Up,&m_Up,&mat);
}
if(y)
{
D3DXMatrixRotationY(&mat,y);
Vec3MulMat(&m_Look,&m_Look,&mat);
Vec3MulMat(&m_Up,&m_Up,&mat);
}
if(z)
{
D3DXMatrixRotationZ(&mat,z);
Vec3MulMat(&m_Look,&m_Look,&mat);
Vec3MulMat(&m_Up,&m_Up,&mat);
}
}

void CCamera::Rotate(float x,float y,float z)
{
if(x)
{
RotateWithAxis(&m_Look,&m_Look,&m_Right,x);
RotateWithAxis(&m_Up,&m_Up,&m_Right,x);
}
if(y)
{
RotateWithAxis(&m_Look,&m_Look,&m_Up,y);
RotateWithAxis(&m_Up,&m_Up,&m_Up,y);
}
if(z)
{
RotateWithAxis(&m_Look,&m_Look,&m_Look,z);
RotateWithAxis(&m_Up,&m_Up,&m_Look,z);
}
CheckRightUpLook();
}

void CCamera::Move(float dx,float dy,float dz)
{
if(dx)MoveOnAxis(&m_Pos,&m_Right,&m_Pos,dx);
if(dy)MoveOnAxis(&m_Pos,&m_Up,&m_Pos,dy);
if(dz)MoveOnAxis(&m_Pos,&m_Look,&m_Pos,dz);
}

D3DXMATRIX CCamera::GetViewMat()
{
D3DXMATRIX ret;
CreateViewMat(&ret,&m_Pos,&m_Right,&m_Up,&m_Look);
return ret;
}

CCamera::CCamera(float x,float y,float z)
{
m_Pos.x=x;
m_Pos.y=y;
m_Pos.z=z;
m_Up.x=0.0f;
m_Up.y=1.0f;
m_Up.z=0.0f;
m_Look.x=0.0f;
m_Look.y=0.0f;
m_Look.z=1.0f;
m_Right.x=1.0f;
m_Right.y=0.0f;
m_Right.z=0.0f;
}

CCamera::CCamera(D3DXVECTOR3* pos,D3DXVECTOR3* look,D3DXVECTOR3* up)
{
m_Pos=*pos;
m_Up=*up;
m_Look=*look;
CheckRightUpLook();
}
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-12-18 21:56

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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