C++优雅之旅
探索C++
C++博客
::
首页
::
新随笔
::
联系
::
聚合
::
管理
::
15 随笔 :: 0 文章 :: 20 评论 :: 0 Trackbacks
<
2024年12月
>
日
一
二
三
四
五
六
24
25
26
27
28
29
30
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
1
2
3
4
常用链接
我的随笔
我的评论
我参与的随笔
留言簿
(4)
给我留言
查看公开留言
查看私人留言
随笔分类
C++/CLI(2)
(rss)
DirectX(4)
(rss)
HGE(2)
(rss)
IDE相关(1)
(rss)
Irrlicht
(rss)
Lua(3)
(rss)
OGRE(2)
(rss)
OpenGL
(rss)
Qt(1)
(rss)
Win32
(rss)
计算机图形学
(rss)
数据结构与算法
(rss)
随笔档案
2010年5月 (1)
2009年5月 (4)
2009年4月 (1)
2008年12月 (1)
2008年11月 (2)
2008年7月 (1)
2008年4月 (5)
相册
Images
版权声明
林公子
所有原创文章遵循
《创作共用版权协议》
,要求
署名、非商业、保持一致
。在满足
《创作共用版权协议”》
的基础上可以转载,但请以超链接形式注明出处。
搜索
积分与排名
积分 - 94580
排名 - 256
最新评论
1. re: VS2008下编译luabind 0.8.1
您好,我想问一下,可以编译成静态的的么,就是想将多个不同的库编译到一个库当中,这样引用的时候,只引用一个就可以了
--godboy
2. re: Luabind导出类到lua
Init(L) ->> bindClass(L)
--滔海纵舟
3. re: Luabind导出类到lua
构造函数里应该加上一行
TestClass::mSingleton = this;
--滔海纵舟
4. re: VS2008下编译luabind 0.8.1
虽然帖子的时间有点长了,但还是很有效的
--afreet2006
5. re: VS2008下编译luabind 0.8.1
非常感谢,我用你说的这个步骤成功编译luabind 0.9.1
--afreet2006
阅读排行榜
1. [转]string, char*, int类型转换(49331)
2. 在Qt中使用DirectX(12552)
3. D3D中D3DFVF_XYZ和D3DFVF_XYZRHW的区别(4634)
4. C++中取得各种简单数值类型的最大最小值(4054)
5. VS2008下编译luabind 0.8.1(3996)
评论排行榜
1. Luabind导出类到lua(6)
2. VS2008下编译luabind 0.8.1(5)
3. [转]string, char*, int类型转换(5)
4. VC++2005中项目属性中"生成后事件"用法(4)
5. 在Qt中使用DirectX(0)
SceneNode::setDirection函数问题
mSn
->
translate(mPosition
*
evt.timeSinceLastFrame, Node::TS_WORLD);
刚开始学习Ogre,做了个很简单的demo,用键盘的上下左右控制一个人物模型四处走动。逻辑很简单,但是实现到想要的效果却费了一番周折。
一开始用一个Vector3 mPosition变量保存人物的位置,然后Real mWalkSpeed保存人物的移动速度,在上下左右的按键响应代码中分别
写上处理人物各方向移动的代码:
1
bool
DemoFrameListener::keyPressed(
const
OIS::KeyEvent
&
arg)
2
{
3
switch
(arg.key)
4
{
5
//
按下Escape键,退出程序。
6
case
OIS::KC_ESCAPE:
7
mContinue
=
false
;
8
9
//
W、S、A、D控制人物行走。
10
case
OIS::KC_UP:
11
case
OIS::KC_W:
12
mPosition.z
-=
mWalkSpeed;
13
mSn
->
setDirection(Vector3::NEGATIVE_UNIT_Z);
14
//
取得模型的"Walk"动画集。
15
mAnimationState
=
mEntity
->
getAnimationState(
"
Walk
"
);
16
break
;
17
case
OIS::KC_S:
18
case
OIS::KC_DOWN:
19
mPosition.z
+=
mWalkSpeed;
20
mSn
->
setDirection(Vector3::UNIT_Z);
21
//
取得模型的"Walk"动画集。
22
mAnimationState
=
mEntity
->
getAnimationState(
"
Walk
"
);
23
break
;
24
case
OIS::KC_A:
25
case
OIS::KC_LEFT:
26
//
取得模型的"Walk"动画集。
27
mAnimationState
=
mEntity
->
getAnimationState(
"
Walk
"
);
28
mSn
->
setDirection(Vector3::UNIT_X);
29
break
;
30
case
OIS::KC_D:
31
case
OIS::KC_RIGHT:
32
//
取得模型的"Walk"动画集。
33
mAnimationState
=
mEntity
->
getAnimationState(
"
Walk
"
);
34
mSn
->
setDirection(Vector3::NEGATIVE_UNIT_X);
35
break
;
36
}
37
38
return
true
;
39
}
40
然后在每一帧中调用
mSn
->
translate(mPosition
*
evt.timeSinceLastFrame, Node::TS_LOCAL);
来更新人物位置。
编译代码运行,出现了奇怪的效果。初始时人物面朝-Z轴方向,按下后应该面朝+Z轴方向并朝这个方向行走,实际却是面朝+Z方向往-Z轴方向移动。以为逻辑代码写错导致移动方向错误,检查了半天发现一点错误都没有。折腾了两天都没有结果,今天在群里和人聊天时谈到SceneNode::setDirection这个函数,人家说调用SceneNode::setDirection这个函数后会改变模型的局部坐标系,顿时脑子高速运转,隐约觉得离答案已经不远了,自己琢磨的一下,终于解决了问题。
原来,用一个参数(方向向量)调用setDirection函数时,该函数有两个默认值,我遇到的问题就和第二个参数有关,这个参数描述的是setDirection函数操作的参照空间,有Node::TS_LOCAL,Node::TS_PARENT和Node::TS_WORLD三个可选值,分别表示,局部空间,父节点空间和世界空间。在我的例子中,人物的朝向是以整个地图为参照物的,所以,这个参数应该设置成TS_WORLD,如果取其默认值Node::TS_LOCAL,调用setDirection之后,人物的整个局部坐标系的方向都变了,这样一来,当按下方向键时,人物会面向正确的方向,但是移动的参照方向却和原来的相反,这就是为什么会有正确的朝向却背向移动的奇怪现象了。
另外
mSn
->
translate(mPosition
*
evt.timeSinceLastFrame, Node::TS_LOCAL);
中的Node::TS_LOCAL也要改成Node::TS_WORLD,使人物相对于世界空间平移。
posted on 2008-12-30 01:27
林公子
阅读(2626)
评论(0)
编辑
收藏
引用
所属分类:
OGRE
只有注册用户
登录
后才能发表评论。
【推荐】100%开源!大型工业跨平台软件C++源码提供,建模,组态!
相关文章:
Ogre学习笔记(一)
SceneNode::setDirection函数问题
网站导航:
博客园
IT新闻
BlogJava
博问
Chat2DB
管理
Powered by:
C++博客
Copyright © 林公子