??xml version="1.0" encoding="utf-8" standalone="yes"?>99久久免费只有精品国产,2021少妇久久久久久久久久,2021久久精品免费观看http://www.shnenglu.com/jack-wang/category/10929.htmlzh-cnSat, 23 Mar 2013 06:28:57 GMTSat, 23 Mar 2013 06:28:57 GMT60向量的点U和叉积定义http://www.shnenglu.com/jack-wang/archive/2010/08/11/123123.htmlWed, 11 Aug 2010 15:26:00 GMThttp://www.shnenglu.com/jack-wang/archive/2010/08/11/123123.htmlhttp://www.shnenglu.com/jack-wang/comments/123123.htmlhttp://www.shnenglu.com/jack-wang/archive/2010/08/11/123123.html#Feedback0http://www.shnenglu.com/jack-wang/comments/commentRss/123123.htmlhttp://www.shnenglu.com/jack-wang/services/trackbacks/123123.html 

转:(x)http://www.shnenglu.com/lovedday/archive/2008/07/01/22890.html

向量的点U:(x)

假设向量u(ux, uy)?strong>v(vx, vy)Q?strong>u?strong>v之间的夹角ؓ(f)αQ从三角形的边角关系{式出发Q可作出如下单推|(x)

  |u - v||u - v| = |u||u| + |v||v| - 2|u||v|cosα  

===>
 
  Q?strong>ux - vxQ?sup>2 + (uy - vy)= ux2 + uy2 +vx2+vy2- 2|u||v|cosα

===>
  
   -2uxvx - 2uyvy = -2|u||v|cosα

===>

   cosα = (uxvx + uyvy) / (|u||v|)

q样Q就可以Ҏ(gu)向量u?strong>v的坐标D出它们之间的夹角?br>
定义u?strong>v的点U运:(x) u . v = (uxvx + uyvy)Q?/p>

上面的cosα可简写成Q?nbsp;cosα = u . v / (|u||v|)

?strong>u . v = 0Ӟ?strong>uxvx + uyvy = 0Q,向量u?strong>v垂直Q当u . v > 0Ӟu?strong>v之间的夹角ؓ(f)锐角Q当u . v < 0Ӟu?strong>v之间的夹角ؓ(f)钝角?br>
可以运从2l推q到3l?/p>



向量的叉U:(x)

假设存在向量u(ux, uy, uz), v(vx, vy, vz), 求同时垂直于向量u, v的向?strong>w(wx, wy, wz).

因ؓ(f)w?strong>u垂直Q同?strong>w?strong>v垂直Q所?strong>w . u = 0, w . v = 0; ?br>
uxwx + uywy + uzwz = 0;
vxwx + vywy + vzwz = 0;

分别削去方程l的wy?strong>wx变量的系敎ͼ得到如下两个{h(hun)方程式:(x)

(uxvy - uyvx)wx = (uyvz - uzvy)wz
(uxvy - uyvx)wy = (uzvx - uxvz)wz

于是向量w的一般解形式为:(x)

w = (wx, wy, wz) = ((uyvz - uzvy)wz / (uxvy - uyvx), (uzvx - uxvz)wz / (uxvy - uyvx), wz)
  = (wz / (uxvy - uyvx) * (uyvz - uzvy, uzvx - uxvz, uxvy - uyvx))

因ؓ(f)Q?br>
   ux(uyvz - uzvy) + uy(uzvx - uxvz) + uz(uxvy - uyvx)
 = uxuyvz - uxuzvy + uyuzvx - uyuxvz + uzuxvy - uzuyvx
 = (uxuyvz - uyuxvz) + (uyuzvx - uzuyvx) + (uzuxvy - uxuzvy)  
 = 0 + 0 + 0 = 0

   vx(uyvz - uzvy) + vy(uzvx - uxvz) + vz(uxvy - uyvx)  
 = vxuyvz - vxuzvy + vyuzvx - vyuxvz + vzuxvy - vzuyvx
 = (vxuyvz - vzuyvx) + (vyuzvx - vxuzvy) + (vzuxvy - vyuxvz)
 = 0 + 0 + 0 = 0

由此可知Q向?uyvz - uzvy, uzvx - uxvz, uxvy - uyvx)是同时垂直于向量u?strong>v的?br>
为此Q定义向?strong>u = (ux, uy, uz)和向?v = (vx, vy, vz)的叉U运ؓ(f)Q?strong>u x v = (uyvz - uzvy, uzvx - uxvz, uxvy - uyvx)

上面计算的结果可单概括ؓ(f)Q向?strong>u x v垂直于向?strong>u?strong>v?/p>


Ҏ(gu)叉积的定义,沿x坐标轴的向量i = (1, 0, 0)和沿y坐标轴的向量j = (0, 1, 0)的叉Uؓ(f)Q?br>
 i x j = (1, 0, 0) x (0, 1, 0) = (0 * 0 - 0 * 1, 0 * 0 - 1 * 0, 1 * 1 - 0 * 0) = (0, 0, 1) = k

同理可计?strong>j x k:
 
 j x k = (0, 1, 0) x (0, 0, 1) = (1 * 1 - 0 * 0, 0 * 0 - 0 * 1, 0 * 0 - 0 * 0) = (1, 0, 0) = i

以及(qing)k x i:

 k x i = (0, 0, 1) x (1, 0, 0) = (0 * 0 - 1 * 0, 1 * 1 - 0 * 0, 0 * 0 - 0 * 0) = (0, 1, 0) = j

由叉U的定义Q可知:(x)

 v x u = (vyuz - vzuy, vzux - vxuz, vxuy - vyux) = - (u x v)



2010-08-11 23:26 发表评论
]]>
转:(x)【OGRE人门教程】OGRE源码成功~译?81227http://www.shnenglu.com/jack-wang/archive/2009/11/27/102026.htmlThu, 26 Nov 2009 19:15:00 GMThttp://www.shnenglu.com/jack-wang/archive/2009/11/27/102026.htmlhttp://www.shnenglu.com/jack-wang/comments/102026.htmlhttp://www.shnenglu.com/jack-wang/archive/2009/11/27/102026.html#Feedback0http://www.shnenglu.com/jack-wang/comments/commentRss/102026.htmlhttp://www.shnenglu.com/jack-wang/services/trackbacks/102026.html

【原创】【OGRE人门教程】OGRE源码成功~译?81227

Posted on 2008-12-28 17:54 刘文?/a> 阅读(1814) 评论(7)  ~辑 收藏 引用

原帖Q?a href="http://www.shnenglu.com/welflau/archive/2009/02/24/70570.html">http://www.shnenglu.com/welflau/archive/2009/02/24/70570.html
 

OGRE源码成功~译?/span>081227

Made by welflau

1 下蝲最新的OGRE源码?/span>1.6.0

 

 2 直接解压?/span>D盘根目录?br>

 

3 打开sln 我装是的VS2005

 

打开?/span>

4 ~译生成OgreMain


   

5 ?x)出错,q没?/span>Dependencies

因ؓ(f)链接器中昄?jin)?strong>附加?/strong>



 

6 下蝲ogre-dependencies 注意要下载最新版

下蝲地址Q?/strong>

http://sourceforge.net/project/showfiles.php?group_id=2997




下一个页面选择


 

7 解压?/span>D:\ogre-l.6.0\ogre




 

解压完后Q再重新~译生成

OgreMain~译得要一D|?/span>

而且~译?/span>Obj文g?/span>1.6G左右的大,所以编译之前要保证你的盘有够的I间

【注意】还有一?/span>Samples文g夹也要覆盖到Ogre目录?/span>



 

里面是执行时所需?/span>dll文g

l于~译完后Q不q还是有错,文?/span>

 

我去 Dependencies\include\zzip 目录下看的确没这个文?/span>

我又下了(jin)Dependencies其他版本OgreDependencies_VC8SP1_Eihort_20070323

发现有该文g



8
可能是版本不对再?/span>OGRE官方|站
http://www.ogre3d.org/index.php?option=com_content&task=view&id=412&Itemid=132


 

下蝲U框所C那个包Q?/span>OgreDependencies_VC8SP1_Eihort_20071227.zip

解压?/span>OGRE目录D:\ogre-l.6.0\ogre下到重新覆盖一?/span>

再编译生?/span>

l于成功生成



生成?/span>lib?/span>dll如下?/span>



 

其中OgreMain生成的目标文件有1.53G


 

【游戏开发】【原创教E连载】WelfGame【第7讌Ӏ?08120803按钮颜色可控)

【游戏开发】【原创教E连载】WelfGame【第6讌Ӏ?08120702加入皮肤对话?

【游戏开发】【原创教E连载】WelfGame【第5讌Ӏ?WelfGame(08120302三维操作)

【游戏开发】【原创教E连载】WelfGame【第4讌Ӏ?08120301导入三维数据文g .xQ?/font>

【游戏开发】WelfGame【第3讌Ӏ?08120203囑փ透明?qing)颜?

【游戏开发】WelfGame【第2讌Ӏ?08120202l制文字和图像)(j)

【游戏开发】原创:(x)我的游戏开发学?fn)过E(q蝲?..Q?W一?



2009-11-27 03:15 发表评论
]]>
在OGRE中用CEGUI的笔?Q{自清源游民的|络W记本)(j)http://www.shnenglu.com/jack-wang/archive/2009/11/27/102025.htmlThu, 26 Nov 2009 19:09:00 GMThttp://www.shnenglu.com/jack-wang/archive/2009/11/27/102025.htmlhttp://www.shnenglu.com/jack-wang/comments/102025.htmlhttp://www.shnenglu.com/jack-wang/archive/2009/11/27/102025.html#Feedback0http://www.shnenglu.com/jack-wang/comments/commentRss/102025.htmlhttp://www.shnenglu.com/jack-wang/services/trackbacks/102025.html转:(x)http://www.shnenglu.com/yuanyajie/archive/2006/11/01/14485.html

使用 cegui 来制作界?, 不论在何U^C , 有基本的三大步骤要做 :
1, 创徏一?CEGUI::Render 实例
2, 创徏 CEGUI::System 对象
3, 调用各种Ҏ(gu)来渲染用L(fng)?
W一?, 在我使用?ogre 环境下用以下代码来创徏 CEGUI::Render 实例
Ogre3D
CEGUI::OgreCEGUIRenderer* myRenderer =
       new CEGUI::OgreCEGUIRenderer(myRenderWindow);
W二步相当简?, 可?
new CEGUI::System(myRenderer);
W三步,基本上来Ԍ大部分^CQ如 direct3D, OpenGL, 我们在渲染@环的N调用
CEGUI::System::renderGUI 来开始界面的渲染。如果我们?ogre3d 引擎Q这一步不需?
我们昄的执行。因?ogre 引擎已经考虑?jin)?
除了(jin)q三大步之外Q我们还有一些工作要做,首先Q我们需要加载数据文Ӟq且完成初始化工作?
CEGUI 使用?jin)许多类型的文g?CEGUI 使用一个称?ResourceProvider 的帮助对象,用它来做为核?CEGUI 库与外部文g加蝲pȝ的接口。通过实现一个特定的 ResourceProvider 对象Q?cegui 的渲染模块就可以与外部系l的资源理器、文件加载子pȝ无缝地集成?CEGUI 需要的数据文g便可以通过外部pȝ提供的功能来q行加蝲?CEGUI 中的大部分文件是?XML 的文件格式来保存的。缺省情况下Q?CEGUI 在内部?Xerces-C++ 库来分析 XML 文gQ?schema 来对 xml q行校验Q?schema 文g以标准的 .xsd 扩展名来保存 . 许多文g本质上都?XML 格式的文Ӟ但是Ҏ(gu)其意义不同,分别使用?jin)不同的文g扩展名?
.Imageset 文g可将一q图像看做若q小囑փ的集合。换名话_(d)是一q图像的某个区域看做一q独立的囄来用?
.Font 定义?jin)?CEGUI 中所使用的字体类型?
.scheme  可以许多数据组合在一起用,它也是装载与注册 widget 最方便的方法。在一?.scheme 文g中可以包括下列几U数据:(x)
Imagest,font, window Set, window Alias
window set 指定?jin)装载模块?.dll {)(j)的名Uͼ和一l可以注册到pȝ中的 widget.
window alias 提供?jin)别名的功能Q实现已l注册的 window/widget 的Ş式上的隐藏?
.Layout  包含?jin)窗口布局?xml 表示。每个嵌套的 'window' 元素定义?jin)被创徏?window 或是 widget."Property" 元素定义?jin)窗口的讄与属性倹{?
.config 是可供选择的配|文Ӟ他可指定一些缺省的属性?
我们使用 CEGUI 来制作图形界面,臛_要用以下三U文Ӟ(x)
.imageset, .Font . Scheme;
当然Q我们知道在一?Scheme 中是可以包括 imageset ?Font 的?
CEGUI::SchemeManager::getSingleton().loadScheme(“../datafiles/schemes/TaharezLook.scheme”);
// load in a font.  The first font loaded automatically becomes the default font.
CEGUI::FontManager::getSingleton().createFont(“../datafiles/fonts/Commonwealth-10.font”);
对于 ogre 的用者来Ԍ应该?resources.cfg 这些资源所在的目录加进厅R?
我们可用下面的语句来指定 cegui 所需要的~省?font ?cursor 资源?
?cegui 的概念里Q每?widget 都是一?window, 从编E的角度来讲Q每?widget c都是从同一个相同的 window 基类l承而来?. 因此Q?widget ?window 有着基本相同的行为?
H体的许多属性与讄在窗口层?wi)上是可以遗传的。高一U窗口的属性与行ؓ(f)?x)?jing)响到下一U窗口的属性与行ؓ(f)。例如附着在某?window 上的 window ?widget ?x)被?window 影响。当父窗口被 destroy Ӟ它所附属的所有的子窗口与 widget 也都被 destroy.
创徏 CEGUI H口Q我们可以用两UŞ式,一?C Q+代码Q二是编?XML layout 文g?
注意Q在 CEGUI 中,所有的 window 都是?WindowManager singleton object 来统一创徏的。我们首先得到这个对象:(x)
using namespace CEGUI;
WindowManager& wmgr = WindowManager::getSingleton();
一般来Ԍ我们L创徏一?DefaultWindow 来做为我们将使用的窗口的 Root, 在这U方式下Q我们会(x)有比较好的灵zL?
Window* myRoot = wmgr.createWindow(“DefaultWindow”, “root”);
System::getSingleton().setGUISheet(myRoot);
createwindows() 函数所使用的第一个参敎ͼ指明?jin)将要创建的H口cdQ它一般是在我们用的 .scheme 文g中所注册q的Q当然还有一些系l定义的QL有效的窗口类型如上面所提到?DefaultWindow.DefualtWindow 是不可见的,它只是做为所有窗口的 root 来用?
一般我们L要创Z?Framewindow, 它可以包括其他窗口与 widget Q本w也是可视的?
FrameWindow* fWnd = (FrameWindow*)wmgr.createWindow(“TaharezLook/FrameWindow”, “testWindow”);
之后Q我们将创徏的窗口挂?root 上,形成一个层ơ关pR?
myRoot->addChildWindow(fWnd);
~辑 xml layout 文gQ可使用专门提供的制作工兗具体的使用Ҏ(gu)可以参阅相关文档Q这里说一下如何用制作好?xml layout 文g?
using namespace CEGUI;
Window* myRoot = WindowManager::getSingleton().loadWindowLayout(“test.layout”);
System::getSingleton().setGUISheet(myRoot);
首先Q将 layout 文g装蝲q来Q再指定根结炏V?
CEGUI 本n侦测用户输入Q这些不?CEGUI 的责任,而是E序的员的责仅R当有用户外部输入时Q我
们可以选择这些消息告?CEGUI Q这?CEGUI 才会(x)响应?
?ceguir::System cM定义?jin)一l函敎ͼ它作为我们进行消息传递的接口?
bool injectMouseMove(float delta_x, float delta_y);
bool injectMousePosition(float x_pos, float y_pos);
bool injectMouseLeaves(void);
bool injectMouseButtonDown(MouseButton button);
bool injectMouseButtonUp(MouseButton button);
bool injectKeyDown(uint key_code);
bool injectKeyUp(uint key_code);
bool injectChar(utf32 code_point);
bool injectMouseWheelChange(float delta);
bool injectTimePulse(float timeElapsed);
q些函数的返回D明了(jin) CEGUI 是否已经传入的消息 consume 掉了(jin)?
CEGUI 使用回调机制来进行消息处理。可以ؓ(f)某个H体的特定事件注册一个函敎ͼ当窗体事件发生时Q?CEGUI ?x)自动调用所注册的函数?
bool TutorialApplication::handlePopMenu(constCEGUI::EventArgs& e)
?
// 。。。。。进行事件响?
?
void setupEventHandlers(void)
    {
       CEGUI::WindowManager& wmgr = CEGUI::WindowManager::getSingleton();
       wmgr .getWindow((CEGUI::utf8*)"MyButton")->subscribeEvent(
       CEGUI ::PushButton::EventClicked, CEGUI::Event::Subscriber(&TutorialApplication::handlePopMenu, this));
   }

EventClicked :: pȝ预定义的事g . subscribeEvent:: 注册函数Q它事g与响应函数联接在一赗?
?ogre E序中,当侦听器收到键盘Q鼠标消息时Q首先经q适当的{换( CEGUI 可以识别Q再传递给 CEGUI 。下面这个函数执行鼠标键标识转换?
CEGUI::MouseButton convertOgreButtonToCegui(int buttonID)
{
       switch (buttonID)
       {
       case MouseEvent::BUTTON0_MASK:
              return CEGUI::LeftButton;
       case MouseEvent::BUTTON1_MASK:
              return CEGUI::RightButton;
       case MouseEvent::BUTTON2_MASK:
              return CEGUI::MiddleButton;
       case MouseEvent::BUTTON3_MASK:
              return CEGUI::X1Button;
       default:
              return CEGUI::LeftButton;
       }
}

?CEGUI 需要知道的键盘Q鼠标消息告知它。即?OGRE 处理q些消息旉知 CEGUI 。以下这函数说明?jin)用法?
       void mouseMoved (MouseEvent *e)// 鼠标Ud
       {
              CEGUI::System::getSingleton().injectMouseMove(
                   e->getRelX() * mGUIRenderer->getWidth(),
                   e->getRelY() * mGUIRenderer->getHeight());
                   e->consume();
       }

       void mousePressed (MouseEvent *e)// 鼠标按下
       {
              CEGUI::System::getSingleton().injectMouseButtonDown(
               convertOgreButtonToCegui(e->getButtonID()));
             e->consume();
       }
       void mouseReleased (MouseEvent *e)// 鼠标弹v
       {
              CEGUI::System::getSingleton().injectMouseButtonUp(
              convertOgreButtonToCegui(e->getButtonID()));
              e->consume();
       }

       void keyPressed(KeyEvent* e)// 键按?
       {
              CEGUI::System::getSingleton().injectKeyDown(e->getKey());
              CEGUI::System::getSingleton().injectChar(e->getKeyChar());
              e->consume();
       }
       void keyReleased(KeyEvent* e)// 键弹?
       {
             CEGUI::System::getSingleton().injectKeyUp(e->getKey());
             e->consume();

       }
?CEGUI 中用中文的问题Q?nbsp;  现在ȝ?jin)一下在 CEGUI 中显CZ文需要注意的事项 :
    1 、将 simhei.ttf copy to \ogrenew\Samples\Media\gui
    2 、将 simhei-12.font  拷到上目录内容ؓ(f)
<?xml version="1.0"  ?>
<Font Name="SimHei-12" Filename="simhei.ttf" Type="Dynamic" Size="12" NativeHorzRes="800" NativeVertRes="600" 
AutoScaled="true">
<GlyphSet Glyphs=" 你好世界退出演C渲染到新材质徏~辑H口 " /> Q?<---- 自己要用到的汉字Q?
</Font>
注意大小写!Q?GlyphSet Glyphs 是在E序中要用到的汉字,它是?cegui 预生成一个字W图像集用的Q想当然?:-P Q如果修改了(jin)q个文gQ注意要?Unicode Q?UTF-8 Q的~码来保存,?vc7.1 中:(x)文g -> 高保存选项   ?nbsp;  ~码   栏中选择?
    3 、在 TaharezLook.scheme ?
     <Font Name="Tahoma-12" Filename="tahoma-12.font" /> 后加?
     <Font Name="SimHei-12" Filename="simhei-12.font" />  注意大小?
     以上是一些准备工?
    4 、在自己的应用中讄默认字体
    mGUISystem->setDefaultFont((CEGUI::utf8*)"Tahoma-12"); 改ؓ(f)
    mGUISystem->setDefaultFont((CEGUI::utf8*)"SimHei-12");
    5 、在自己的应用程序中可以把相关?Text 属性该Z文了(jin)Q如Q?
    item = new CEGUI::ListboxTextItem((CEGUI::utf8*)" 退?", 6);
    同样要注意的是要保存?Unicode Q?UTF-8 Q的~码。同时这些字要是?simhei-12.font 中定义过的字Q当然也可以象那?CEGUIChieseDemo
那样用动态生成如Q?
    gfont->defineFontGlyphs(gfont->getAvailableGlyphs() + (utf8*)" 当前最?jng)_q_的框架率三角 ");
    ~译自己的程序,应该可以看C文了(jin)Q罗嗦一下,C只要有汉字出现的文g׃存ؓ(f) Unicode Q?UTF-8 Q编码的Q!Q?



2009-11-27 03:09 发表评论
]]>
~译q行Orzhttp://www.shnenglu.com/jack-wang/archive/2009/11/18/101270.htmlWed, 18 Nov 2009 00:05:00 GMThttp://www.shnenglu.com/jack-wang/archive/2009/11/18/101270.htmlhttp://www.shnenglu.com/jack-wang/comments/101270.htmlhttp://www.shnenglu.com/jack-wang/archive/2009/11/18/101270.html#Feedback0http://www.shnenglu.com/jack-wang/comments/commentRss/101270.htmlhttp://www.shnenglu.com/jack-wang/services/trackbacks/101270.html2.注意Q从svn上下载的代码Q工E的默认当前路径为Orz\Scripts\vc8Q如果用vc8~译Q。奇怪!
3.从官|上下蝲依赖文gQdependencies文g夹)(j)Q将dependencies文gҎ(gu)|于包含Orz_vc8.sln的目录中?br>各个工程文g?#8220;附加包含目录”中做如此修改Q?.\..\dependencies\dependencies\include
链接器的“附加包含?#8221;中做如此修改Q?.\..\dependencies\dependencies\lib\debug

2009-11-18 08:05 发表评论
]]>
vs2005环境下CELayoutEditor源码~译详细步骤 http://www.shnenglu.com/jack-wang/archive/2009/06/18/88040.htmlThu, 18 Jun 2009 14:51:00 GMThttp://www.shnenglu.com/jack-wang/archive/2009/06/18/88040.htmlhttp://www.shnenglu.com/jack-wang/comments/88040.htmlhttp://www.shnenglu.com/jack-wang/archive/2009/06/18/88040.html#Feedback1http://www.shnenglu.com/jack-wang/comments/commentRss/88040.htmlhttp://www.shnenglu.com/jack-wang/services/trackbacks/88040.html今天初试?jin)一下CEGUI的官方编辑器——CELayoutEditorQ其q程真可?#8220;饱受挫折”。现要写下其源码的编译过E,已可能?x)用到的朋友走些弯路?br>1. 要编译CELayoutEditorQ自焉要先~译CEGUI的东东,?U选择Q?
1.1 安装SDKQ这是下载地址Qhttp://jaist.dl.sourceforge.net/sourceforge/crayzedsgui/CEGUI-SDK-0.5.0b-vc8.exeQ不qƈ不推荐这U方法,因ؓ(f)SDK里的debug版dllg有问题。。?
1.2 ~译其源代码。下载地址Qhttp://jaist.dl.sourceforge.net/sourceforge/crayzedsgui/CEGUI-0.5.0b.zipQ另外还需要下载依赖文件包dependencies package Q下载地址是:(x)http://jaist.dl.sourceforge.net/sourceforge/crayzedsgui/CEGUI-DEPS-0.5.0b-vc8.zipQ然后将依赖文g解压q源代码文g夹就O(jin)K?jin)?nbsp;
1.2.1 先别急着找solutionQ有个地斚w要注意。CEGUI默认的是OPENGL渲染Q如果是用D3D的话q得改一个地斏V进..\makefiles\premake文gҎ(gu)到config.lua文gQ记事本打开。改?#8220;OPENGL_RENDERER = falseQDIRECTX9_RENDERER = true”Q保存?
1.2.2 q行build_vs2005.bat文gQ执行完毕后?x)生成CEGUI.sln文gQ打开可直接~译?
1.3 建立环境变量Q我的电(sh)脑\属性\高\环境变量Q然后在上面的用户变量区新徏一个,变量名是CEGUIQ变量值是CEGUI的解压目录。注意这步不能省

2 ׃CELayoutEditor使用?jin)wxWidgetsQ所以在~译CELayoutEditor之前q需要下载wxWidgets。目前最新版本是2.86Q进入官方下载网http://www.wxwidgets.org/downloads/ 选择WxAll下蝲?
2.1 建立环境变量Q我的电(sh)脑\属性\高\环境变量Q然后在上面的用户变量区新徏一个,变量名是WXWIDGETSQ变量值是wxWidgets的解压目录?2.2 qwxWidgets的解压目录找到wx.dswQ打开?#8220;Yes To All”转换。{换完毕后先别~译Q还需要改下?br>因ؓ(f)wxWidgets默认q不是OPENGL Open $(WXWIDGETS)\include\wx\msw\setup.h and replace Code: #define wxUSE_GLCANVAS 0 WITH Code: #define wxUSE_GLCANVAS 1 7.2 Open $(WXWIDGETS)\include\wx\univ\setup.h and replace Code: #if defined(__WIN32__) #define wxUSE_GLCANVAS 1 else #define wxUSE_GLCANVAS 0 WITH Code: #define wxUSE_GLCANVAS 1
2.3 现在可以开始编译了(jin)?br>注意要选择“Unicode Debug”?#8220;'Unicode Release”方式

3 下蝲CELayoutEditor?br>我是用SVN接的Q地址?https://crayzedsgui.svn.sourceforge.net/svnroot/crayzedsgui/CELayoutEditor/trunk
3.1 解压后打开工程Q将Include和Lib路径Ҏ(gu)自己的,其他的不用改?br>3.2 建立环境变量Q我的电(sh)脑\属性\高\环境变量Q然后在上面的用户变量区新徏一个,变量名是CE_LAYOUT_EDITOR Q变量值是CELayoutEditor的解压目录。注意这步不能省?br>3.3 l于可以开始编译了(jin)。。?

4 4.1 ~译?x)出C个错误,暂时我还没找到解x法,仅仅是给错误的地Ҏ(gu)释掉?jin)。。。然后就~译成功?jin)?
4.2 拷一些东西过?
TO $(CE_LAYOUT_EDITOR)\bin\debug (Debug configuration) - CEGUIBase_d.dll - CEGUIExpatParser_d.dll - CEGUIFalagardWRBase_d.dll - CEGUISILLYImageCodec_d.dll - CEGUITGAImageCodec_d.dll - OpenGLGUIRenderer_d.dll - SILLY_d.dll TO $(CE_LAYOUT_EDITOR)\bin\release (Release configuration) - CEGUIBase.dll - CEGUIExpatParser.dll - CEGUIFalagardWRBase.dll - CEGUISILLYImageCodec.dll - CEGUITGAImageCodec.dll - OpenGLGUIRenderer.dll - SILLY.dll 4.3 SILLY.dll和SILLY_d.dll在依赖文件夹?
OK。。。到q里完?jin),虽然q个工具的bug很多Q不q不怕,~译它就是ؓ(f)?jin)要攚w它Q呵c(din)?br>希望此文对你有所帮助?

2009-06-18 22:51 发表评论
]]>
用OgreOde创徏一个会(x)走动的角?/title><link>http://www.shnenglu.com/jack-wang/archive/2009/01/02/70974.html</link><dc:creator>王</dc:creator><author>王</author><pubDate>Thu, 01 Jan 2009 20:56:00 GMT</pubDate><guid>http://www.shnenglu.com/jack-wang/archive/2009/01/02/70974.html</guid><wfw:comment>http://www.shnenglu.com/jack-wang/comments/70974.html</wfw:comment><comments>http://www.shnenglu.com/jack-wang/archive/2009/01/02/70974.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/jack-wang/comments/commentRss/70974.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/jack-wang/services/trackbacks/70974.html</trackback:ping><description><![CDATA[<div class="6666616" id=content><strong><span>?span>OgreOde</span>创徏一个会(x)走动的角?/span></strong> <br> <p align=left>原文<a >http://www.game798.com/html/2007-12/5156.htm</a><br><span><br></span><span>W一?span> by SuperMegaMau </span></span></p> <p align=left><span>q个教程包括的代码和法是作者自ql验<span>,</span>也许不正或不怎么准确<span>,</span>如果发现问题L(fng)正?/span></p> <p align=left> </p> <table cellPadding=0 width=318 border=0> <tbody> <tr> <td> <p align=left><strong><span>内容</span></strong></p> <ul type=disc> <li><u><span>1 </span></u><u><span>介绍</span></u> <li><span>2 <span><span>创徏物理模型</span></span><span><span> </span></span> </span> <ul type=circle> <li><span>2.1 <span><span>创徏角色</span></span><span><span> </span></span> </span> <li><u><span>2.2 </span></u><u><span>获取<span> AABB</span></span></u><span> </span> <li><u><span>2.3 </span></u><u><span>创徏新空?</span></u><span> </span> <li><u><span>2.4 </span></u><u><span>创徏?</span></u><span> </span> <li><u><span>2.5 </span></u><u><span>创徏椭球 </span></u><span> </span> <li><u><span>2.6 </span></u><u><span>创徏兌 </span></u><span> </span> </li> </ul> <li><u><span>3 </span></u><u><span>Ud角色 </span></u><span> </span> <ul type=circle> <li><u><span>3.1 </span></u><u><span>前后Ud</span></u><span> </span> <li><span>3.2 <span><span>左右旋{</span></span><span><span> </span></span> </span> </li> </ul> <li><u><span>4 </span></u><u><span>让角色爬h </span></u> <li><u><span>5 </span></u><u><span>问题 </span></u></li> </ul> </td> </tr> </tbody> </table> <p align=left><strong><span>介绍</span></strong></p> <p align=left><span>我相信我不是W一问如何用<span>OgreOde</span>创徏一个运动角艌Ӏ搜索论坛和<span>wiki</span>后,我意识到q是一个很有用的信息。这个教E解释了(jin)如何创徏一个可以在地Ş上行走的q动角色Q包括其?span>meshes</span>Q如?wi)和房屋Q?/span></p> <p align=left><strong><span>创徏物理模型</span></strong></p> <p align=left><span>我按照在<span>Monster</span>的方法用下图代表一个角Ԍ(x)</span></p> <p align=left><span></span></p> <p align=left><span>下面<span>,</span>我假设你?span>Ogre</span>?span>SceneNodes, meshes </span>?span>AlignedBoxes</span>都有所?jin)解Qƈ且会(x)?span>SceneManager</span>创徏地Ş?/span></p> <p align=left><strong><span>创徏角色</span></strong></p> <p align=left><span>首先创徏一?span>SceneNode</span>来放角色?span>mesh</span>Q在q个例子中我用了(jin)<span>Ogre</span>例子中的忍者模型。创Z?span>SceneNode</span>q把它们q在一赗后面我?x)解释?f)什么是两个<span>Node</span>?/span></p> <p align=left><span>Entity* ninja = mSceneMgr->createEntity("ninja","ninja.mesh");</span></p> <p align=left><span>SceneNode* ninjaNode = mSceneMgr->getRootSceneNode()->createChildSceneNode("ninja");</span></p> <p align=left><span>SceneNode* modelNode = ninjaNode->createChildSceneNode("ninja_model");</span></p> <p align=left><span>modelNode->attachObject(ninja);</span></p> <p align=left><span>ninjaNode->setScale(0.05,0.05,0.05);</span></p> <p align=left><span> <table cellSpacing=0 cellPadding=0 width="100%"> <tbody> <tr> <td> <div> <p><span>RootSceneNode</span></p> </div> </td> </tr> </tbody> </table> <table cellSpacing=0 cellPadding=0 width="100%"> <tbody> <tr> <td> <div> <p><span>ninjaNode</span></p> </div> </td> </tr> </tbody> </table> <table cellSpacing=0 cellPadding=0 width="100%"> <tbody> <tr> <td> <div> <p><span>modelNode</span></p> </div> </td> </tr> </tbody> </table> </span></p> <p align=left><span>也许你已l注意到Q?span>ninjaNode</span>被羃攑־很小Q这是因为如?span>mesh</span>很大的话渲染的速度变很慢Q不知道Z么)(j)?/span></p> <p align=left><strong><span>获取<span> AABB(</span></span></strong><strong><span>AxisAlignedBox, </span></strong><strong><span>轴对齐包围盒</span></strong><strong><span>) </span></strong></p> <p align=left><span>现在?span>AxisAlignedBox</span>获取<span>mesh</span>的大?/span></p> <p align=left><span>AxisAlignedBox aab = modelNode->getAttachedObject("ninja")->getBoundingBox(); </span></p> <p align=left><span>Ogre::Vector3 min = aab.getMinimum()*ninjaNode->getScale();</span></p> <p align=left><span>Ogre::Vector3 max = aab.getMaximum()*ninjaNode->getScale();</span></p> <p align=left><span>Ogre::Vector3 center = aab.getCenter()*ninjaNode->getScale();</span></p> <p align=left><span>Ogre::Vector3 size(fabs(max.x-min.x),fabs(max.y-min.y),fabs(max.z-min.z));</span></p> <p align=left><span>float radius = (size.x>size.z)?size.z/2.0f:size.x/2.0f; </span></p> <p align=left> </p> <p align=left><strong><span>创徏一个新I间<span> </span></span></strong></p> <p align=left><span>我们需要创Z个新I间把角色放在其中,q且取消内部撞(g)?/span></p> <p align=left><span>OgreOde::SimpleSpace* dollSpace = new OgreOde::SimpleSpace(_world->getDefaultSpace());</span></p> <p align=left><span>dollSpace->setInternalCollisions(false);</span></p> <p align=left><strong><span>创徏球体<span>(</span><span>腉K<span>) </span></span></span></strong></p> <p align=left><span>现在有了(jin)两个<span>SceneNodes</span>Q?span> "ninjaNode" </span>?span> "modelNode"</span>?span>ninjaNode</span>是代表你角色的节点,<span>modelNode</span>是你真正?span>mesh</span>的地斏V这么做是因?span>mesh</span>的中?j)L?span>OgreOde::Body</span>的中?j),所以我们用<span>ninjaNode</span>来创建碰撞体的位|,然后Ҏ(gu)<span>ninjaNode</span>?span>OgreOde::Body</span>来获?span>mesh</span>的正位|?/span></p> <p align=left><span></span></p> <p align=left><span>左边图是用一?span>SceneNode</span>所得到的效果,双是用两个<span>SceneNode</span>。你可以注意刎ͼ左边的角色?zhn)在半空中。下面代码创Z(jin)一个球体代表角色的脚部。我们需要一?span>SphereGeometry</span>和一?span>TransformGeometry </span>球体放到正位|?/span></p> <p align=left><strong><span>译注Q注释ؓ(f)我的猜想Q具体不知道步骤q么复杂Q欢q纠正?span> </span></span></strong></p> <p align=left><span><span>Q?Q?span>        </span></span></span><span>创徏一个碰撞体Q命名ؓ(f)<span>feet</span></span></p> <p align=left><span><span>Q?Q?span>        </span></span></span><span>讄撞体ؓ(f)球Ş物体Q半径ؓ(f)<span>AABB</span>获得的半?/span></p> <p align=left><span><span>Q?Q?span>        </span></span></span><span>SphereGeometry</span><span>Q半径ؓ(f)<span>AABB</span>获得的半?/span></p> <p align=left><span><span>Q?Q?span>        </span></span></span><span>TransformGeometry</span><span>Q空间ؓ(f)刚才创徏的空?span>, TransformGeometry</span>g是ؓ(f)?jin)包含某特定形状的几何?/span></p> <p align=left><span><span>Q?Q?span>        </span></span></span><u><span>改变<span>modelNode</span>相对?span>ninjiaNode</span>的位|,以便让脚占到C</span></u></p> <p align=left><span><span>Q?Q?span>        </span></span></span><span>?span>TransformGeometry</span>包含一?span>OgreOde::Body</span>和一个几何体</span></p> <p align=left><span><span>Q?Q?span>        </span></span></span><span>?span>Ogre::Body</span>_到<span>ninjaNode</span>?/span></p> <p align=left><span>怀疑创?span>SphereGeometry</span>是否只是?span>Ogre::Body</span>兯?/span></p> <p align=left> </p> <p align=left><span>OgreOde::Body* dollFeetBody = new OgreOde::Body("feet");<span>   </span></span></p> <p align=left><span>dollFeetBody->setMass(OgreOde::SphereMass(70*2.5,radius)); </span></p> <p align=left><span>OgreOde::SphereGeometry* feetGeom = new OgreOde::SphereGeometry(radius);</span></p> <p align=left><span>OgreOde::TransformGeometry* feetTrans = new OgreOde::TransformGeometry(dollSpace); </span></p> <p align=left><span>modelNode->translate(Vector3(0,-radius/ninjaNode->getScale().y,0));</span></p> <p align=left><span>feetTrans->setBody(dollFeetBody); </span></p> <p align=left><span>feetTrans->setEncapsulatedGeometry(feetGeom);</span></p> <p align=left><span>ninjaNode->attachObject(dollFeetBody);</span></p> <p align=left><strong><span>创徏椭球?span> </span></span></strong></p> <p align=left><span>对于角色的上半n用一个椭球体来表C?span> </span></span></p> <p align=left><strong><span>译注</span></strong><span>Q和上面一栗?/span></p> <p align=left><span><span>Q?Q?span>        </span></span></span><span>创徏<span>Ogre::Body</span></span></p> <p align=left><span><span>Q?Q?span>        </span></span></span><span>讄<span>Ogre::Body</span>形状Q另外设|不被重力媄(jing)响,</span></p> <p align=left><span><span>Q?Q?span>        </span></span></span><span>创徏<span>TransformGeometry</span>Q空间ؓ(f)刚才创徏的空?/span></p> <p align=left><span><span>Q?Q?span>        </span></span></span><span>创徏<span>CapsuleGeometry</span>Q半径ؓ(f)<span>AABB</span>获得半径</span></p> <p align=left><span><span>Q?Q?span>        </span></span></span><span>讄<span>CapsuleGeometry</span>位置和方向和d</span></p> <p align=left><span><span>Q?Q?span>        </span></span></span><span>?span>TransformGeometry</span>包含<span>Ogre::body</span></span></p> <p align=left><span><span>Q?Q?span>        </span></span></span><span>?span>TransformGeometry</span>包含<span>CapsuleGeometry</span></span></p> <p align=left><span><span>Q?Q?span>        </span></span></span><span>?span>Ogre::Body</span>_到<span>ninjiaNode</span>?/span></p> <p align=left><span>OgreOde::Body* dollTorsoBody = new OgreOde::Body("torso"); </span></p> <p align=left><span>dollTorsoBody->setMass(OgreOde::CapsuleMass(70*2.5,radius,Vector3::UNIT_Y,radius)); </span></p> <p align=left><span>dollTorsoBody->setAffectedByGravity(false);</span></p> <p align=left><span>dollTorsoBody->setDamping(0,50000);</span></p> <p align=left><span>OgreOde::TransformGeometry* torsoTrans = new OgreOde::TransformGeometry(dollSpace); </span></p> <p align=left><span>OgreOde::CapsuleGeometry* torsoGeom = new OgreOde::CapsuleGeometry(radius,size.y-4*radius,dollSpace); </span></p> <p align=left><span>torsoGeom->setPosition(Ogre::Vector3(0,size.y-((size.y-4*radius)/2+2*radius),0)); //can't find a good way to explain this</span></p> <p align=left><span>torsoGeom->setOrientation(Quaternion(Degree(90),Vector3::UNIT_X));</span></p> <p align=left><span>torsoTrans->setBody(dollTorsoBody); </span></p> <p align=left><span>torsoTrans->setEncapsulatedGeometry(torsoGeom);</span></p> <p align=left><span>ninjaNode->attachObject(dollTorsoBody);</span></p> <p align=left><span>q个几何体和脚的几何体在同一个空_(d)所以我们要取消内部撞(g)。讲d讄高些Qƈ且取消重力,不然它会(x)从那个球体上掉下来?/span></p> <p align=left><strong><span>创徏兌<span> </span></span></strong></p> <p align=left><span>剩下的事情就是将两个撞体连在一起了(jin)。一个绞q连接的代表是自行R前轮?span> </span></span></p> <p align=left><span>OgreOde::HingeJoint* joint = new OgreOde::HingeJoint();</span></p> <p align=left><span>joint->attach(dollTorsoBody,dollFeetBody);</span></p> <p align=left><span>joint->setAxis(Ogre::Vector3::UNIT_X);<span>      </span>//set the rotation axis</span></p> <p align=left><strong><span>注意Q?/span></strong><span>不要忘记记录所有碰撞体和连接的位置以便你之后能得到它们。你可以?span>ogre</span>堆栈或者创Z自己的?/span></p> <p align=left><strong><span>Ud角色<span> </span></span></strong></p> <p align=left><span>你可以通过不同Ҏ(gu)Ud或者旋转你的角Ԍ我决定通过改变撞体方向而不是施加力或者力矩?/span></p> <p align=left><strong><span>前后Ud<span> </span></span></strong></p> <p align=left><span>下面代码可以攑֜按键响应里执行,?span>KC_UP</span>。现在你需要获取碰撞体Q从堆栈或?span>hashTable</span>中获得,然后获取它的方向。我用:(x)</span></p> <p align=left><strong><span>译注Q猜惛_栈就是你为屏q上所有物体所创徏?span>Ogre::Body</span>的一个列表?span> </span></span></strong></p> <p align=left><span>OgreOde::Body* torso = torsoBodies->getObject("ninja");</span></p> <p align=left><span>Quaternion q = torso->getOrientation();</span></p> <p align=left><span>然后赋予脚一个角速度?span> </span></span></p> <p align=left><span>OgreOde::Body* feet = feetBodies->getObject("ninja");</span></p> <p align=left><span>feet->wake();</span></p> <p align=left><span>feet->setAngularVelocity(q*Ogre::Vector3(10*cos(1),0,10*sin(1)));</span></p> <p align=left><span>10</span><span>是我们用的角速度Q必M以三角函C便让角色向正的方向前进?/span></p> <p align=left><strong><span>左右转动<span> </span></span></strong></p> <p align=left><span>下面代码同样攑֜按键响应中执行,比如<span>KC_RIGHT</span>?span> </span></span></p> <p align=left><span>OgreOde::Body* torso = torsoBodies->getObject("ninja");</span></p> <p align=left><span>Quaternion q1 = torso->getOrientation();</span></p> <p align=left><span>Quaternion q2(Degree(-4),Ogre::Vector3::UNIT_Y);</span></p> <p align=left><span>torso->setOrientation(q1*q2);</span></p> <p align=left><span>?span>Degree(-4)</span>让角色向双{动,用正数向左{动。也怽已经注意刎ͼ我L从椭球体获取或者设|方向。我没有太多惻I我想如果你从脚的球体来获取和讄也应该没有什么问题?/span></p> <p align=left><strong><span>注意Q?/span></strong><span>如果你松开按键Q你必须把速度讄?span>0</span>来停止运动?/span></p> <p align=left><span>feetbody->setAngularVelocity(Vector3(0,0,0));</span></p> <p align=left><span>feetBody->setLinearVelocity(Vector3(0,feetBody->getLinearVelocity().y,0));</span></p> <p align=left><strong><span>让角色爬h<span> </span></span></strong></p> <p align=left><span>最后,我们要确定你的角色不摔倒,所以我们需要不旉新设定他的垂直方向?span> </span></span></p> <p align=left><span>OgreOde::Body* torso = torsoBodies->getObject("ninja");</span></p> <p align=left><span>Quaternion q = torso->getOrientation();<span>                      </span></span></p> <p align=left> </p> <p align=left><span>Vector3 x = q.xAxis();</span></p> <p align=left><span>Vector3 y = q.yAxis();</span></p> <p align=left><span>Vector3 z = q.zAxis();</span></p> <p align=left> </p> <p align=left><span>torso->wake();</span></p> <p align=left><span>torso->setOrientation(Quaternion(x,Vector3::UNIT_Y,z));</span></p> <p align=left><strong><span>问题<span> </span></span></strong></p> <p align=left><span>部分代码没有我想象的那么好。我重新讑֮垂直方向?x)让角色有奇怪的行ؓ(f)。虽然我讄?jin)速度?span>0</span>Q但是角色在一些不规则的表面上仍然无法停下来?span> </span></span></p> </div> <img src ="http://www.shnenglu.com/jack-wang/aggbug/70974.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/jack-wang/" target="_blank">王</a> 2009-01-02 04:56 <a href="http://www.shnenglu.com/jack-wang/archive/2009/01/02/70974.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>DXUTq阶(译)http://www.shnenglu.com/jack-wang/archive/2009/01/02/70964.htmlThu, 01 Jan 2009 19:36:00 GMThttp://www.shnenglu.com/jack-wang/archive/2009/01/02/70964.htmlhttp://www.shnenglu.com/jack-wang/comments/70964.htmlhttp://www.shnenglu.com/jack-wang/archive/2009/01/02/70964.html#Feedback0http://www.shnenglu.com/jack-wang/comments/commentRss/70964.htmlhttp://www.shnenglu.com/jack-wang/services/trackbacks/70964.htmlDXUTq阶(译)
DXUTq阶

概要
q个指南늛?jin)更多DXUT的高U应? q个指南里的大部分功能是可选的, Z(jin)以最的代h(hun)来增Z的应用程? DXUT提供?jin)一个简单的ZGUIpȝ的精灵和一个设备设|对话框. 另外, 它还提供?jin)一些摄像机c?
q个指南的结果是一个具有完善功能的GUI 用于更改讑֤和场景的讄. 它将有按? 滑块, 和文本来Cq些功能.
D
• DXUT摄像?
• DXUT对话?
• 资源理E序初始?
• 3D讄对话?
• 文本渲染
DXUT 摄像?br>DXUT中的CModelViewerCamera cd以简单的的管理视囑֏换和透视变换, 像GUI 的功能一?
    CModelViewerCamera g_Camera;  // A model viewing camera
摄像机类提供的第一个功能是创徏视图和透视矩阵. 有了(jin)q个摄像?没有必要担心(j)q些矩阵. 反? 你可以指定你在哪, 你看着什?q有H口的大? 然后, 把这些参C递给摄像机对? 它会(x)在后台创些矩?
q里我们讄摄像机的一部分视图参数. 我们指定我们在哪,和我们看着什?
    // Initialize the camera
    D3DXVECTOR3 Eye( 0.0f, 0.0f, -800.0f );
    D3DXVECTOR3 At( 0.0f, 0.0f, 0.0f );
    g_Camera.SetViewParams( &Eye, &At );
接下?我们指定摄像机的投媄(jing)参数. 也就是说, 我们需要提供观察角?U|? 和视图截锥的q、远裁剪? q些信息跟之前的指南提供的一? 不同的是, 你不必担?j)怎么d建矩?
    // Setup the camera's projection parameters
    float fAspectRatio = pBackBufferSurfaceDesc->Width / (FLOAT)pBackBufferSurfaceDesc->Height;
    g_Camera.SetProjParams( D3DX_PI/4, fAspectRatio, 0.1f, 5000.)0f );
    g_Camera.SetWindow( pBackBufferSurfaceDesc->Width, p00BackBufferSurfaceDesc->Height );
另外, q个摄像装?jin)简单的鼠标反馈. 在这? 我们指定三个鼠标按键l提供的鼠标操作: 模型旋{, 攄, q有摄像机旋?试着~译工程q用每个按键体会(x)一下各个操?
    g_Camera.SetButtonMasks( MOUSE_LEFT_BUTTON, MOUSE_WHEEL, MOUSE_MIDDLE_BUTTON );
在这个按钮组的基? 摄像Z(x)监听q些输入q生相应效? Z(jin)响应用户输入, 需要加入一个监听到MsgProc回调函数QDXUT消息处理函数Q?
    // Pass all remaining windows messages to camera so it can respond to user input
    g_Camera.HandleMessages( hWnd, uMsg, wParam, lParam );
最?在把所有数据都输入摄像机后, 是取出真正的变换矩늚时候了(jin). q里我们用相兛_数获取投q阵和视图矩阵. 摄像机对象会(x)自己计算q些矩阵.
    g_pProjectionVariable->SetMatrix( (float*)g_Camera.GetProjMatrix() );
    g_pViewVariable->SetMatrix( (float*)g_Camera.GetViewMatrix() );
DXUT 对话?br>用户交互可以用CDXUTDialog来实? 它在一个包含控件的对话框里接受用户输入,q且通过E序句柄传递它? 首先, 对话框类要实例化, 然后每个单独的控件才能加?
声明
在这个指南里, 有两个对话框?x)被加? 一个叫 g_HUD跟D3D10CZ׃n相同的代? 另一个叫 g_SampleUI 用于昄函数l节l这个指? W二个对话框用来控制模型?胖瘦",是讄一个变量传递给shaders.
    CDXUTDialog g_HUD;      // manages the 3D UI
    CDXUTDialog g_SampleUI; // dialog for sample specific controls
q些对话框被CDXUTDialogResourceManager控制着.q个理E序?x)在对话框之间传递消息ƈ处理׃n资源.
    CDXUTDialogResourceManager g_DialogResourceManager; // manager for shared resources of dialogs
最? 一些回调函CGUI处理的实际消息相兌. q个函数用于处理控g间的交互.
    void CALLBACK OnGUIEvent( UINT nEvent, int nControlID, CDXUTControl* pControl, void* pUserContext );
对话框初始化
既然已经介绍?jin)许多有用的东? 那么需要被初始? q个指南这些模块的真正初始化{Ud一个单独的函数, ?InitApp().
每个对话框的控g被初始化是在这个函数里. 每个对话框都需要调用它的初始化函数, q传递给资源理者来指定把控件供l谁. 同样, 它们讄回调函数来处理GUI 响应. 既然q样, q个相关的回调函数是 OnGUIEvent.
    g_HUD.Init( &g_DialogResourceManager );
    g_SampleUI.Init( &g_DialogResourceManager );
    g_HUD.SetCallback( OnGUIEvent );
    g_SampleUI.SetCallback( OnGUIEvent );
在它们被初始化后, 每个都对话框可以加入它们惌使用的控? 对话?HUD加入?个按钮用于基本功? 切换全屏, 切换引用 (软g) 渲染? 和改变设?
要加入一个按? 你要指定你想要用的IDC 标识W? 一个用于显C的字符? 坐标, 宽和? q有可选的与它兌的热? 热键可以用键盘快速地开兌些按?
注意指定的坐标与对话框的定位相关.
    int iY = 10;
    g_HUD.AddButton( IDC_TOGGLEFULLSCREEN, L"Toggle full screen", 35, iY, 125, 22 );
    g_HUD.AddButton( IDC_TOGGLEREF, L"Toggle REF (F3)", 35, iY += 24, 125, 22 );
    g_HUD.AddButton( IDC_CHANGEDEVICE, L"Change device (F2)", 35, iY += 24, 125, 22, VK_F2 );
同样对于sample UI, 加入?jin)这些控?一个静(rn)态文?一个滑? q有一个复选按?
传递给?rn)态文本的参数是IDC 标识W?字符?坐标, 和宽?
滑块的参数是IDC 标识W?字符?坐标, 和宽? q有滑块的最大最? 最后是存储l果的变?
复选按钮包括IDC标识W?一个字W串标签,wf坐标, 宽高,q有存储l果的布?yu)(dng)?
    iY = 10;
    WCHAR sz[100];
    iY += 24;
    StringCchPrintf( sz, 100, L"Puffiness: %0.2f", g_fModelPuffiness );
    g_SampleUI.AddStatic( IDC_PUFF_STATIC, sz, 35, iY += 24, 125, 22 );
    g_SampleUI.AddSlider( IDC_PUFF_SCALE, 50, iY += 24, 100, 22, 0, 2000, (int)(g_fModelPuffiness*100.0f) );
   
    iY += 24;
    g_SampleUI.AddCheckBox( IDC_TOGGLESPIN, L"Toggle Spinning", 35, iY += 24, 125, 22, g_bSpinning );
一旦初始化? q个对话框要昄在屏q上. q个?OnD3D10ResizedSwapChain 调用来完成既然屏q坐标每ơ改变这个交换链?x)重?(可能׃H口大小的变?.
    g_HUD.SetLocation( pBackBufferSurfaceDesc->Width-170, 0 );
    g_HUD.SetSize( 170, 170 );
    g_SampleUI.SetLocation( pBackBufferSurfaceDesc->Width-170, pBackBufferSurfaceDesc->Height-300 );
    g_SampleUI.SetSize( 170, 300 );
对话框的最后一步在哪需要鉴别它们自己是 OnD3D10FrameRender 函数. 一个对话框如果你不l制它ƈ且用L(fng)不到不太好吧?
    //
    // Render the UI
    //
    g_HUD.OnRender( fElapsedTime );
    g_SampleUI.OnRender( fElapsedTime );
资源理E序初始?br>资源理E序在每ơ回调初始化和销毁时需要被初始? q是因ؓ(f)在每ơ设备被重徏的时?GUI需被重? 或者交换链被重建的时? CDXUTDialogResourceManager cd含符合每个这L(fng)回调的函? h一模一L(fng)名字. 因此, 它仅仅是在合适的地方插入代码来调用它?
    V_RETURN( g_DialogResourceManager.OnD3D10CreateDevice( pd3dDevice ) );
    V_RETURN( g_DialogResourceManager.OnD3D10ResizedSwapChain( pd3dDevice, pBackBufferSurfaceDesc ) );
    g_DialogResourceManager.OnD3D10ReleasingSwapChain();
    g_DialogResourceManager.OnD3D10DestroyDevice();
响应GUI事g
当全部初始化完成? 我们最后可以开始写代码来处理GUI交互? 在我们初始化对话框的时?我们讄q些对话框的回调函数做ؓ(f)OnGUIEvent. 现在我们要创徏 OnGUIEvent 函数, 它会(x)监听q处理GUI 相关事g(被框架调用的).
q是一个简单的Ҏ(gu)个IDC标识W包含一个case代码块的函数Q它在对话框创徏时被监听. 在每个case块中?x)是处理代?假设用户以某U方式控?q里的处理控制的代码?Win32 代码很像.
跟HUD 相关的控制实际上调用DXUT内置的函? 有一个DXUT 函数关系到切换全? l定引用软g渲染? q且更改讑֤讄(它会(x)调用下面提到?D讄对话?.
SampleUI 对话框包含自定义的代码操作跟滑块相关联的变量. 它会(x)攉数? 更新与它相关的文? q把数g递给滑块.
    void CALLBACK OnGUIEvent( UINT nEvent, int nControlID, CDXUTControl* pControl, void* pUserContext )
    {
       
        switch( nControlID )
        {
            case IDC_TOGGLEFULLSCREEN: DXUTToggleFullScreen(); break;
            case IDC_TOGGLEREF:        DXUTToggleREF(); break;
            case IDC_CHANGEDEVICE:    g_D3DSettingsDlg.SetActive( !g_D3DSettingsDlg.IsActive() ); break;
   
            case IDC_TOGGLESPIN:
            {
                g_bSpinning = g_SampleUI.GetCheckBox( IDC_TOGGLESPIN )->GetChecked();
                break;
            }
   
            case IDC_PUFF_SCALE:
            {
                g_fModelPuffiness = (float) (g_SampleUI.GetSlider( IDC_PUFF_SCALE )->Getvalue() * 0.01f);
   
                WCHAR sz[100];
                StringCchPrintf( sz, 100, L"Puffiness: %0.2f", g_fModelPuffiness );
                g_SampleUI.GetStatic( IDC_PUFF_STATIC )->SetText( sz );
   
                g_pPuffiness->SetFloat( g_fModelPuffiness );
                break;
            }
        }
       
    }
更新消息处理
既然现在我们有对话框消息和用户交? 那就?x)有传递给应用E序的消息需要被解析, 如果适用的话.那些代码?x)在DXUT提供?MsgProc 回调函数中被处理. 在之前的指南? q段是空白因为没有消息需要被处理. 但是现在,我们要确保发送给资源理E序和对话框的消息被适当地发?
不需要专门的消息处理代码; 我们只需要对每个对话框调用MsgProcs来确保消息被处理?q通过调用每个单独的类的相应的 MsgProc 函数来完? 应该注意到这个函数提供了(jin)一个标记通报l框Ӟ不需要更多的处理, 因此,可以退?
    LRESULT CALLBACK MsgProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, bool* pbNoFurtherProcessing, void* pUserContext )
    {
        // Always allow dialog resource manager calls to handle global messages
        // so GUI state is updated correctly
        *pbNoFurtherProcessing = g_DialogResourceManager.MsgProc( hWnd, uMsg, wParam, lParam );
        if( *pbNoFurtherProcessing )
            return 0;
   
        if( g_D3DSettingsDlg.IsActive() )
        {
            g_D3DSettingsDlg.MsgProc( hWnd, uMsg, wParam, lParam );
            return 0;
        }
   
        // Give the dialogs a chance to handle the message first
        *pbNoFurtherProcessing = g_HUD.MsgProc( hWnd, uMsg, wParam, lParam );
        if( *pbNoFurtherProcessing )
            return 0;
        *pbNoFurtherProcessing = g_SampleUI.MsgProc( hWnd, uMsg, wParam, lParam );
        if( *pbNoFurtherProcessing )
            return 0;
   
        if( uMsg == WM_CHAR && wParam == '1' )
            DXUTToggleFullScreen();
   
        return 0;
    }
3D讄对话?br>有一个专门的内置对话框用来控制D3DDevice的设|? DXUT提供的这个对话框是CD3DSettingsDlg. 它的功能像一个自定义对话?但是它会(x)提供l用h有的他们需要修改的讄选项.
    CD3DSettingsDlg        g_D3DSettingsDlg;      // Device settings dialog
初始化就像其它对话框一? 你可以调用初始化函数. 然? 每次Direct3D 改变它的交换链或者设?q个对话框必被更新.因此, 它必d含一个调用在OnD3D10CreateDevice 和OnD3D10ResizedSwapChain? 相对应地命名, 来反映这些改? 同样?销毁对象的改变必须被通报, 因? 需要在 OnD3D10DestroyDevice里调?
    g_D3DSettingsDlg.Init( &g_DialogResourceManager );
   
    V_RETURN( g_D3DSettingsDlg.OnD3D10CreateDevice( pd3dDevice ) );
    V_RETURN( g_D3DSettingsDlg.OnD3D10ResizedSwapChain( pd3dDevice, pBackBufferSurfaceDesc ) );
   
    g_D3DSettingsDlg.OnD3D10DestroyDevice();
在渲染的q一? 因ؓ(f)对话框的出现可以被改?它通过一个叫 IsActive()的标记来转换. 如果q个标记被设成false, 那么q个面板不?x)被渲?q个面板的改变是受上面说q的HUD对话框处理的. 标记The IDC_CHANGEDEVICE与HUD 控g相关, 像上面提到的那?
    if( g_D3DSettingsDlg.IsActive() )
    {
        g_D3DSettingsDlg.MsgProc( hWnd, uMsg, wParam, lParam );
        return 0;
    }
一旦这些初始步骤都完成? 你就可以在你的程序中加入q个对话? 试着~译q个指南q与更改讄的面板进行交互来观察它的效果. 真正的D3DDevice 或交换链的重构在DXUT内部完成.
文本渲染
一个程序不?x)有如果用户不知道q什? 所以就DXUT包含?jin)一个工L(fng)用于在屏q上l制2D 文本, 用来l用户反? q个c? CDXUTD3D10TextHelper, 允许你在屏幕的Q意位|绘制一行行的文? q有单的字符串输? 开始之? 我们要实例化q个c? 既然文本渲染与大多数初始化过E独? 在这个指南里我们让大部分代码在RenderText10?
    CDXUTD3D10TextHelper txtHelper( g_pFont, g_pSprite, 15 );
初始?br>我们传入的第一个参数是我们要绘制的字体. 字体的类型是D3DX提供的ID3DXFont. 要初始化q个字体, 你调用D3DX10CreateFont, q且你要传入讑֤, 高度, 宽度, 重量, mip层次 (一般取 1), 斜体, 字符? _ֺ, 质量, 倾斜度和家族, 字体名称, q有你的对象的指? 虽然它看h像很多字W? 只有开始的4个和最后的2个真正有意义.
    V_RETURN( D3DX10CreateFont( pd3dDevice, 15, 0, FW_BOLD, 1, FALSE, DEFAULT_CHARSET,
                                OUT_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE,
                                L"Arial", &g_pFont ) );
W?个参数需要我们初始化一个ID3DXSprite c? 要做q个的话, 我们可以调用 D3DX10CreateSprite (notice the trend here?). q个函数只需要设备和对象的指针做为参?
    // Initialize the sprite
    V_RETURN( D3DX10CreateSprite( pd3dDevice, &g_pSprite ) );
当然, 像其它对象一? 字体和精灵在我们完成时必被销? q可以用常见?SAFE_RELEASE 宏完?
    SAFE_RELEASE( g_pFont );
    SAFE_RELEASE( g_pSprite );
渲染
在这个示例里包含的文本里有渲染的l计信息. 另外, q有一个区域显C怎样用鼠标操作模?
渲染必须在OnD3D10FrameRender里调? 而且在这个指南里, 它是在渲染调用里调用RenderText10来完成的.
W一个区域一直在l制, 因此, 它最先完? W一个文本渲染调用是Begin(). 它通知引擎我要开始输出文本到屏幕. 在那之后, 我们讄?#8220;指针”的位|? 文本的颜? 我们准备绘制了(jin).
输出一个字W串文本要调用DrawTextLine来完? 你传入字W串, 它就?x)在当前位置输? 它在文本书写的同时增加指? 因此, 如果q包含?jin)一个\n, 它会(x)自动Ud指针C一?
    // Output statistics
    txtHelper.Begin();
    txtHelper.SetInsertionPos( 2, 0 );
    txtHelper.SetForegroundColor( D3DXCOLOR( 1.0f, 1.0f, 0.0f, 1.0f ) );
    txtHelper.DrawTextLine( DXUTGetFrameStats() );
    txtHelper.DrawTextLine( DXUTGetDeviceStats() );
q有另一个方法来输出文本, 好似通常使用的printf. 你用Ҏ(gu)的字W来格式化字W串, 然后插入变量到字W串? q通过DrawFormattedTextLine来实?
    txtHelper.SetForegroundColor( D3DXCOLOR( 1.0f, 1.0f, 1.0f, 1.0f ) );
    txtHelper.DrawFormattedTextLine( L"fTime: %0.1f  sin(fTime): %0.4f", fTime, sin(fTime) );
既然帮助l制用一U相似的方式, 所以不需要涵盖那部分代码? 一定要注意你能在Q何时候通过调用SetInsertionPos来重新设|指针的位置.
最? 当你Ҏ(gu)本输出满意后, 调用 End() 来通知引擎你完成了(jin).
Feedback? Please provide us with your comments on this topic.
For more help, visit the DirectX Developer Center
© 2005 Microsoft Corporation. All rights reserved.


2009-01-02 03:36 发表评论
]]>
һŮȫƾþƬ| һþ㽶| ĻƷѾþ| Ʒѿþþ㽶| 99þһa| Ʒþþþþù| 99þֻƷ | ˾þóۺӰԺ| ھƷþþþþ鶹| ҹƷþþþþ| 91Ʒþþþþ| þùƷһ| ޹ŮƷþþþá| þˬˬAV | þۺۺϾþۺ| þþþŮAAƬ| ھƷþþþþ99 | ƷŷƬþùŷ...| þþ91Ʒһ| ݺݸɺݺݾþ| 999þþѹƷ| ƷŮͬһþ| þþþþݴۺϾƷ| ۺϾþһ| ھƷþۺ88| ĻþþƷ1| þþƷAV뽿ɫ| ޾Ʒھþ| 91Ʒ91þ| ޾Ʒҹvaþ| ھƷþ| þþùƷվ| պƷþþþþþõӰ| þúݺݸ߳޾Ʒ| þþþ99ƷƬëƬ | þҹɫƷվ| 91þ㽶Ů߿| ĻþþƷ| þۺϾɫۺվ| Ʒþþþþ| þ޾ƷVA|