游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2694|回复: 6

设置相机绕某点旋转时遇到的问题

[复制链接]

64

主题

272

帖子

272

积分

中级会员

Rank: 3Rank: 3

积分
272
发表于 2007-11-3 21:11:00 | 显示全部楼层 |阅读模式
我开始做的时候用sin和cos函数改变x和z的值可以成功使相机绕y族旋转。

后来又想试一下用D3DXMatrixRotationY函数实现看看,不过发现镜头静止不动。具体像下面那样做
D3DXVECTOR3 pos( 3.0f, 3.0f, 3.0f );
D3DXVECTOR3 at( 0.0f, 0.0f, 0.0f );
D3DXVECTOR3 up( 0.0f, 1.0f, 0.0f );
D3DXMATRIX  view;

static float Ry = 0;                                //ry定义为静态变量
:3DXMatrixRotationY( &view, Ry );                 //这里旋转view矩阵
D3DXMatrixLookAtLH( &view, &pos, &at, &up );
Device->SetTransform( D3DTS_VIEW, &view );         //设置相机

//下面是每次循环都对Ry累加,超过了360度就回复为0
Ry += timeDelta;
f ( Ry > 6.28 )
Ry = 0;

不过想想好像这样旋转的是相机本身而不是相机相对y族(世界坐标的),但结果出来的画面是静止的……究竟应该怎样做呢 [em21]

0

主题

1

帖子

5

积分

新手上路

Rank: 1

积分
5
发表于 2007-11-3 21:56:00 | 显示全部楼层

Re:设置相机绕某点旋转时遇到的问题

摄像机问题困扰我好久了,一直在这个地方停止不前

D3DXMatrixLookAtLH并不是一个好的办法

貌似四元组是很好的解决方案

66

主题

223

帖子

223

积分

中级会员

Rank: 3Rank: 3

积分
223
发表于 2007-11-3 22:10:00 | 显示全部楼层

Re:设置相机绕某点旋转时遇到的问题

D3DXMatrixLookAtLH
个人理解这个函数的第一个参数是纯粹用来输出的,也就是说不管原来你view矩阵里面是什么,这个函数统统给你换掉,改变下调用顺序试试看吧

2

主题

429

帖子

435

积分

中级会员

Rank: 3Rank: 3

积分
435
发表于 2007-11-3 22:38:00 | 显示全部楼层

Re:设置相机绕某点旋转时遇到的问题

摄像机问题困扰我好久了,一直在这个地方停止不前

D3DXMatrixLookAtLH并不是一个好的办法

貌似四元组是很好的解决方案
============
D3DXMatrixLookAtLH是生成view矩阵,和四元数没关系。这两个不矛盾的。

D3DXMatrixRotationY( &view, Ry );                 //这里旋转view矩阵
D3DXMatrixLookAtLH( &view, &pos, &at, &up );
========
等同于:
i=a++;
i=2;
i最后的值当然是2。

64

主题

272

帖子

272

积分

中级会员

Rank: 3Rank: 3

积分
272
 楼主| 发表于 2007-11-4 16:08:00 | 显示全部楼层

Re:设置相机绕某点旋转时遇到的问题

哦,开始我理解的不好。

按照楼上兄弟的说法view是生成的矩阵,那么我生成以后再对view做旋转也是不行,即
D3DXMatrixLookAtLH( &view, &pos, &at, &up );
D3DXMatrixRotationY( &view, Ry );   
这样结果屏幕上的图形没绘制出来,为什么啊??

8

主题

65

帖子

65

积分

注册会员

Rank: 2

积分
65
发表于 2007-11-4 17:00:00 | 显示全部楼层

Re:设置相机绕某点旋转时遇到的问题

D3DXMatrixRotationY( &view, Ry );//你这样做还是和4楼说的是一样

================================

这个时候输出就不应该再用view矩阵了,应该另外定义一个矩阵,然后把它跟view相乘。

0

主题

769

帖子

1052

积分

金牌会员

Rank: 6Rank: 6

积分
1052
发表于 2007-11-4 18:12:00 | 显示全部楼层

Re:设置相机绕某点旋转时遇到的问题

我做的DEMO中的部分代码,摄像头始终对着一个模型看,那模型移动的时候就跟着动
其中
m_ORobot0是模型的类,GetXPos就是获取这个模型在X轴上的值
m_Camera是一个摄像头类,Point函数就是使得摄像头由一个点往另外一个点望过去的效果
也许对楼主有点用

HRESULT cApp::Frame()
{
        static DWORD StartTime = timeGetTime();

        DWORD Time = timeGetTime() - StartTime;

        str = new char[1000];
        ::sprintf(str,"XRotate = %f YRotate = %f ZRotate = %f",m_ORobot0.GetXRotation(),m_ORobot0.GetYRotation(),m_ORobot0.GetZRotation());


        //响应输入设备
        DoInput();
        float rY = m_ORobot0.GetYRotation();
        float lenght = sqrt((m_ORobot0.GetXPos()*m_ORobot0.GetXPos()+m_ORobot0.GetZPos()*m_ORobot0.GetZPos()));
        m_Camera.Update();
        m_Graphics.SetCamera(&m_Camera);

        m_Camera.Point(m_ORobot0.GetXPos()-50*cos(-rY),m_ORobot0.GetYPos()+10,m_ORobot0.GetZPos()-50*sin(-rY),m_ORobot0.GetXPos(),m_ORobot0.GetYPos(),m_ORobot0.GetZPos());
       
        //渲染桢
        RenderFrame();
        return S_OK;

}

HRESULT cApp:oInput()
{

        //获取输入设备信息       
        m_Keyboard.Acquire(TRUE);
        m_Keyboard.Read();
        m_Mouse.Acquire(TRUE);
        m_Mouse.Read();

        float rY = m_ORobot0.GetYRotation();
        if(m_Keyboard.GetKeyState(DIK_W))       
        {
                m_ORobot0.MoveRel(cos(-rY),0,sin(-rY));
        }
        if(m_Keyboard.GetPureKeyState(DIK_S))       
        {
                m_ORobot0.MoveRel(-cos(-rY),0,-sin(-rY));
        }
        if(m_Keyboard.GetPureKeyState(DIK_A))       
        {
                m_ORobot0.RotateRel(0,-0.05f,0);               
        }
        else if(m_Keyboard.GetPureKeyState(DIK_D ))
        {
                m_ORobot0.RotateRel(0,0.05f,0);
        }
        if(m_Keyboard.GetPureKeyState(DIK_SPACE))       
        {
                 jump = true;
        }
        return S_OK;
}
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-6-19 03:54

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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