﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-C++优雅之旅</title><link>http://www.cppblog.com/eros/</link><description>探索C++</description><language>zh-cn</language><lastBuildDate>Fri, 03 Apr 2026 19:37:14 GMT</lastBuildDate><pubDate>Fri, 03 Apr 2026 19:37:14 GMT</pubDate><ttl>60</ttl><item><title>luabind读取lua脚本中的变量</title><link>http://www.cppblog.com/eros/archive/2010/05/15/115417.html</link><dc:creator>林公子</dc:creator><author>林公子</author><pubDate>Fri, 14 May 2010 17:40:00 GMT</pubDate><guid>http://www.cppblog.com/eros/archive/2010/05/15/115417.html</guid><wfw:comment>http://www.cppblog.com/eros/comments/115417.html</wfw:comment><comments>http://www.cppblog.com/eros/archive/2010/05/15/115417.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/eros/comments/commentRss/115417.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/eros/services/trackbacks/115417.html</trackback:ping><description><![CDATA[<p style="FONT-FAMILY: 微软雅黑">&nbsp;&nbsp;&nbsp; &nbsp;刚开始使用luabind，对一些基本的使用有些了解，记录下来以备查阅。这篇文章里主要讨论如何在C++中访问lua脚本中的变量，函数。<br>&nbsp;&nbsp;&nbsp; &nbsp;假设有一个test.lua脚本，内容如下：</p>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><span style="COLOR: #008080">&nbsp;1</span><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #000000">--</span><span style="COLOR: #000000">test.lua<br></span><span style="COLOR: #008080">&nbsp;2</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><br></span><span style="COLOR: #008080">&nbsp;3</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">function</span><span style="COLOR: #000000">&nbsp;printColor()<br></span><span style="COLOR: #008080">&nbsp;4</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp;colour&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;ColourValue(</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">);<br></span><span style="COLOR: #008080">&nbsp;5</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp;colour:printColor();<br></span><span style="COLOR: #008080">&nbsp;6</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">end<br></span><span style="COLOR: #008080">&nbsp;7</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><br></span><span style="COLOR: #008080">&nbsp;8</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">Config&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;<br></span><span style="COLOR: #008080">&nbsp;9</span><span style="COLOR: #000000"><img id=Codehighlighter1_106_173_Open_Image onclick="this.style.display='none'; Codehighlighter1_106_173_Open_Text.style.display='none'; Codehighlighter1_106_173_Closed_Image.style.display='inline'; Codehighlighter1_106_173_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_106_173_Closed_Image onclick="this.style.display='none'; Codehighlighter1_106_173_Closed_Text.style.display='none'; Codehighlighter1_106_173_Open_Image.style.display='inline'; Codehighlighter1_106_173_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif"></span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_106_173_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_106_173_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">10</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;color&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;ColourValue(</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">),<br></span><span style="COLOR: #008080">11</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;count&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">5</span><span style="COLOR: #000000">,<br></span><span style="COLOR: #008080">12</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;fun&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;printColor<br></span><span style="COLOR: #008080">13</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"><br></span><span style="COLOR: #008080">14</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif">}</span></span></div>
<br><span style="FONT-FAMILY: 微软雅黑">&nbsp;&nbsp;&nbsp;&nbsp; <span style="FONT-FAMILY: 微软雅黑">ColourValue是C++类，定义如下：<br></span></span>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><span style="COLOR: #008080">&nbsp;1</span><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;ColourValue<br></span><span style="COLOR: #008080">&nbsp;2</span><span style="COLOR: #000000"><img id=Codehighlighter1_18_319_Open_Image onclick="this.style.display='none'; Codehighlighter1_18_319_Open_Text.style.display='none'; Codehighlighter1_18_319_Closed_Image.style.display='inline'; Codehighlighter1_18_319_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_18_319_Closed_Image onclick="this.style.display='none'; Codehighlighter1_18_319_Closed_Text.style.display='none'; Codehighlighter1_18_319_Open_Image.style.display='inline'; Codehighlighter1_18_319_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif"></span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_18_319_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_18_319_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">&nbsp;3</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">:<br></span><span style="COLOR: #008080">&nbsp;4</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;ColourValue(</span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000">&nbsp;r&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1.0</span><span style="COLOR: #000000">,<br></span><span style="COLOR: #008080">&nbsp;5</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000">&nbsp;g&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1.0</span><span style="COLOR: #000000">,<br></span><span style="COLOR: #008080">&nbsp;6</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000">&nbsp;b&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1.0</span><span style="COLOR: #000000">,<br></span><span style="COLOR: #008080">&nbsp;7</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000">&nbsp;a&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1.0</span><span style="COLOR: #000000">)&nbsp;:&nbsp;mR(r),&nbsp;mB(b),&nbsp;mG(g),&nbsp;mA(a)<br></span><span style="COLOR: #008080">&nbsp;8</span><span style="COLOR: #000000"><img id=Codehighlighter1_143_146_Open_Image onclick="this.style.display='none'; Codehighlighter1_143_146_Open_Text.style.display='none'; Codehighlighter1_143_146_Closed_Image.style.display='inline'; Codehighlighter1_143_146_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_143_146_Closed_Image onclick="this.style.display='none'; Codehighlighter1_143_146_Closed_Text.style.display='none'; Codehighlighter1_143_146_Open_Image.style.display='inline'; Codehighlighter1_143_146_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_143_146_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_143_146_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">&nbsp;9</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif">&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">10</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"><br></span><span style="COLOR: #008080">11</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;printColor()<br></span><span style="COLOR: #008080">12</span><span style="COLOR: #000000"><img id=Codehighlighter1_169_261_Open_Image onclick="this.style.display='none'; Codehighlighter1_169_261_Open_Text.style.display='none'; Codehighlighter1_169_261_Closed_Image.style.display='inline'; Codehighlighter1_169_261_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_169_261_Closed_Image onclick="this.style.display='none'; Codehighlighter1_169_261_Closed_Text.style.display='none'; Codehighlighter1_169_261_Open_Image.style.display='inline'; Codehighlighter1_169_261_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_169_261_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_169_261_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">13</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;mR&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">14</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;mG&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">15</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;mB&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">16</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;mA&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;<br></span><span style="COLOR: #008080">17</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;endl;<br></span><span style="COLOR: #008080">18</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif">&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">19</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"><br></span><span style="COLOR: #008080">20</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"></span><span style="COLOR: #0000ff">protected</span><span style="COLOR: #000000">:<br></span><span style="COLOR: #008080">21</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000">&nbsp;mR;<br></span><span style="COLOR: #008080">22</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000">&nbsp;mG;<br></span><span style="COLOR: #008080">23</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000">&nbsp;mB;<br></span><span style="COLOR: #008080">24</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000">&nbsp;mA;<br></span><span style="COLOR: #008080">25</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif">}</span></span><span style="COLOR: #000000">;</span></div>
<br><span style="FONT-FAMILY: 微软雅黑">&nbsp;&nbsp;&nbsp;&nbsp; C++导出类到lua中可以见之前的一篇文章(<a href="http://www.cppblog.com/eros/archive/2009/05/02/81661.html" target=_blank>点这里</a>)，就不再赘述，假设ColourValue和它的成员函数printColor()已经导出到lua，那么如何在C++中访问Config表中的变量呢？这里就要用到luabind中的globals(lua_State* L)函数</span> 。<br><br>&nbsp;&nbsp;&nbsp; <span style="FONT-FAMILY: 微软雅黑">这个函数返回的是全局表，表中包含加载的lua脚本中所有的变量，下面依次讲解如何来获取Config表中的三个变量。<br></span>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><span style="COLOR: #008080">1</span><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;取得全局表对象。</span><span style="COLOR: #008000"><br></span><span style="COLOR: #008080">2</span><span style="COLOR: #008000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #000000">luabind::</span><span style="COLOR: #0000ff">object</span><span style="COLOR: #000000">&nbsp;global&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;luabind::globals(L);</span></div>
&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp; <span style="FONT-FAMILY: 微软雅黑">lua脚本中的所有元素都是放在这个全局表中的，所以可以用lua table的语法来访问其中的元素：<br></span>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><span style="COLOR: #008080">1</span><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;获取脚本中的Config表。</span><span style="COLOR: #008000"><br></span><span style="COLOR: #008080">2</span><span style="COLOR: #008000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #000000">luabind::</span><span style="COLOR: #0000ff">object</span><span style="COLOR: #000000">&nbsp;configTable&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;global[</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Config</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">];</span></div>
&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp; <span style="FONT-FAMILY: 微软雅黑">这样，就可以通过configTable访问Config表中的元素了：</span><br>&nbsp;&nbsp;&nbsp; <span style="FONT-FAMILY: 微软雅黑">①访问color:</span><br>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><span style="COLOR: #008080">1</span><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;访问Config表中的color。</span><span style="COLOR: #008000"><br></span><span style="COLOR: #008080">2</span><span style="COLOR: #008000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #000000">ColourValue&nbsp;color&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;luabind::object_cast</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">ColourValue</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">(configTable[</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">color</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">]);</span></div>
&nbsp;&nbsp;<span style="FONT-FAMILY: 微软雅黑">&nbsp;&nbsp; 注意，这里有一个转型动作，因为ColorValue类已经导入到lua中，所以luabind知道如何转换，否则，转换将发生异常。<br></span>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; <span style="FONT-FAMILY: 微软雅黑">②访问count：</span>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><span style="COLOR: #008080">1</span><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;访问Config表中count。</span><span style="COLOR: #008000"><br></span><span style="COLOR: #008080">2</span><span style="COLOR: #008000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;count&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;luabind::object_cast</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">(configTable[</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">count</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">]);</span></div>
&nbsp;&nbsp;&nbsp;&nbsp; <span style="FONT-FAMILY: 微软雅黑">有了之前的讲述，这个应该很好理解了。</span><br><br>&nbsp;&nbsp;&nbsp;&nbsp; <span style="FONT-FAMILY: 微软雅黑">③访问printColor：</span><br>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><span style="COLOR: #008080">1</span><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;访问Config表中的printColor函数。</span><span style="COLOR: #008000"><br></span><span style="COLOR: #008080">2</span><span style="COLOR: #008000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #000000">luabind::</span><span style="COLOR: #0000ff">object</span><span style="COLOR: #000000">&nbsp;printColor&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">configTable[</span><span style="COLOR: #000000">"fun</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">];</span></div>
&nbsp;&nbsp;&nbsp;&nbsp; <span style="FONT-FAMILY: 微软雅黑">在C++代码中调用printColor有两种方法：</span><br>&nbsp;&nbsp;&nbsp;&nbsp;
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><span style="COLOR: #008080">1</span><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #000000">printColor();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;第一种调用方法。</span><span style="COLOR: #008000"><br></span><span style="COLOR: #008080">2</span><span style="COLOR: #008000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #000000">luabind::call_function</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">(printColor);&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;第二种调用方法。</span></div>
&nbsp;&nbsp;&nbsp; <span style="FONT-FAMILY: 微软雅黑">注意第二种调用方法使用了call_function函数的重载形式。<br><br>&nbsp;&nbsp;&nbsp;&nbsp; 如果要访问全局表中的变量，方法是一样的，只不过是使用globle句柄进行访问，这里就不再赘言。</span> 
<img src ="http://www.cppblog.com/eros/aggbug/115417.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/eros/" target="_blank">林公子</a> 2010-05-15 01:40 <a href="http://www.cppblog.com/eros/archive/2010/05/15/115417.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Ogre学习笔记(一)</title><link>http://www.cppblog.com/eros/archive/2009/05/20/83455.html</link><dc:creator>林公子</dc:creator><author>林公子</author><pubDate>Wed, 20 May 2009 03:48:00 GMT</pubDate><guid>http://www.cppblog.com/eros/archive/2009/05/20/83455.html</guid><wfw:comment>http://www.cppblog.com/eros/comments/83455.html</wfw:comment><comments>http://www.cppblog.com/eros/archive/2009/05/20/83455.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/eros/comments/commentRss/83455.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/eros/services/trackbacks/83455.html</trackback:ping><description><![CDATA[<span style="color: red;">本系列文章部分内容来源于</span><a style="color: red;"  href="http://ogre3d.cn/">http://ogre3d.cn
</a><span style="color: red;">的Ogre系列教程的中文翻译版，加上一些我自己学习时的笔记。</span><br><br>Ogre三基石<br><br>SceneManager 场景管理器<br><br>&nbsp;&nbsp;&nbsp; 屏幕上显示的所有东西都有场景管理器来管理。当往场景中添加物体时，场景管理器会记录物体的位置，当添加摄像机来观察某个场景时，场景管理器会记录摄像机的位置。Ogre里有多种场景管理器<br><br>Entity 实体<br><br>&nbsp;&nbsp;&nbsp; 一个实体是可以在场景中渲染的物体之一。可以把实体理解为任何一个3D模型。一个机器人可以使一个实体，一条鱼可以是一个实体，大地草原可以是一个非常大的实体。<span style="color: red;">灯光，摄像机，粒子，广告牌等不能成为实体。</span><br>&nbsp;&nbsp;&nbsp; Ogre中你不能直接将一个实体放入场景中，而是将实体与场景节点绑在一起，这个场景节点则包括了实体的方位信息。<br><br>SceneNode 场景节点<br>&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; 场景节点将持续跟踪与它绑在一起的实体的方位。当你创建了一个实体时，它直到与一个场景节点绑定后才会被渲染。同样，一个场景节点也不能单独的在屏幕上显示出来，只有与一个实体绑定后才能在屏幕上显示。<span style="color: red;">一个场景节点可以绑定多个实体，场景节点同样可以和其他场景节点绑定，但是一个实体不能被多个场景节点绑定。</span><br>&nbsp;&nbsp;&nbsp; 每个场景管理器都有一个根节点，而场景节点都是在根节点的基础上建立，其位置总是相对于根节点的。<br><br>实践<br><br>&nbsp;&nbsp;&nbsp; 要创建一个实体，可以调用SceneManager的createEntity方法：<br>&nbsp;&nbsp;&nbsp;
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;"></span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;创建一个实体,&nbsp;加载Athena网格。</span><span style="color: #008000;"></span><span style="color: #000000;"><br>Entity</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;entity1&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;mSceneMgr</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">createEntity(</span><span style="color: #000000;">"</span><span style="color: #000000;">athene1</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">athene.mesh</span><span style="color: #000000;">"</span><span style="color: #000000;">);</span></div>
&nbsp;&nbsp;&nbsp; createEntity的第一个参数为实体指定了一个唯一的标识符，第二个参数表示要加载的资源名称，在这里是一个名为athene的网格模型。<br><br>&nbsp;&nbsp;&nbsp; 我们可以为这个实体代表的网格模式指定一个材质：<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;设置网格材质。</span><span style="color: #008000;"><br></span><span style="color: #000000;">entity1</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">setMaterialName(</span><span style="color: #000000;">"</span><span style="color: #000000;">Examples/Athene/NormalMapped</span><span style="color: #000000;">"</span><span style="color: #000000;">);</span></div>
<br>&nbsp;&nbsp;&nbsp; 创建了一个实体后，还要创建一个场景节点与它绑定起来：<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;创建一个子场景节点。</span><span style="color: #008000;"><br></span><span style="color: #000000;">SceneNode</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;node1&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;mSceneMgr</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">getRootSceneNode()</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">createChildSceneNode(</span><span style="color: #000000;">"</span><span style="color: #000000;">athene1</span><span style="color: #000000;">"</span><span style="color: #000000;">);</span></div>
&nbsp;&nbsp;&nbsp; 与实体一样，场景节点的名字也是唯一的，在这里是athene1。<br><br>&nbsp;&nbsp;&nbsp; 然后将实体和场景节点绑定：<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;将实体绑定到场景节点上。</span><span style="color: #008000;"><br></span><span style="color: #000000;">node1</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">attachObject(entity1);</span></div>
&nbsp;&nbsp;&nbsp; 绑定之后实体就会被渲染出来，默认情况下实体会被渲染到世界坐标的原点(0, 0, 0)处。<br><br>&nbsp;&nbsp;&nbsp; 要改变实体在场景中的位置，可以使用与之绑定的场景节点的setPosition方法：<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">node1</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">setPosition(</span><span style="color: #000000;">30</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">);</span></div>
&nbsp;&nbsp;&nbsp; 这样场景节点就相对于根节点往X轴正方向移动了10个单位。<br><br>&nbsp;&nbsp;&nbsp; 同样，还可以使用场景节点的translate方法达到相同的目的：<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">node1</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">translate(Vector3(</span><span style="color: #000000;">30</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">));</span></div>
&nbsp;&nbsp;&nbsp; setPosition位置的改变是相对于父节点的,translate则可以设置变换相对于哪个坐标系。<br><br>&nbsp;&nbsp;&nbsp; 要得到场景节点的父节点，可以调用getParentNode:<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">SceneNode* </span><span style="color: #000000;"></span><span style="color: #000000;">parentNode&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;node1</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">getParentSceneNode();</span></div>
&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; 要得到场景节点的名称，可以调用getName:<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">String&nbsp;nodeName&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;nod1</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">getName();</span></div>
<br>&nbsp;&nbsp;&nbsp; 因为场景节点的移动都是相对于父节点的，所以很容易实现两个节点一起移动：<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">Entity&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">entity1&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;mSceneMgr</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">createEntity(&nbsp;</span><span style="color: #000000;">"Athene1</span><span style="color: #000000;"></span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">Athene.mesh</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;);<br>SceneNode&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">node1&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;mSceneMgr</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">getRootSceneNode()</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">createChildSceneNode(&nbsp;</span><span style="color: #000000;">"Athene</span><span style="color: #000000;">Node1</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;);<br>ode1</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">attachObject(&nbsp;entity1 );<br><br>Entity&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">entity2&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;mSceneMgr</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">createEntity(&nbsp;</span><span style="color: #000000;">"</span>Athene2<span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">"</span>Athene<span style="color: #000000;">.mesh</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;);<br>SceneNode&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">node2&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #000000;">node1</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">createChildSceneNode(&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">AtheneNode2</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;Vector3(&nbsp;</span><span style="color: #000000;">50</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">&nbsp;)&nbsp;);<br>node2</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">attachObject(&nbsp;entity2&nbsp;);</span></div>
&nbsp;&nbsp;&nbsp; 这样一来，node1就成了node2的父节点，移动node1会使node2跟着一起移动，而移动node2不会影响node1。<br><br>缩放<br><br>&nbsp;&nbsp;&nbsp; 使用场景节点可以对网格模型进行缩放：<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">node1</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">scale(</span><span style="color: #000000;">1.5</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">1.5</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">1.5</span><span style="color: #000000;">);</span></div>
&nbsp;&nbsp;&nbsp; scale的三个参数分别对应x, y, z方向上的缩放比例，上面的例子将网格模型放大到1.5倍。<br><br>旋转<br><br>&nbsp;&nbsp;&nbsp; 还可以对网格模型进行旋转，其中yaw是Y轴的旋转，pitch是X轴的旋转，roll是Z轴的旋转：<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">node1</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">yaw(Degree(</span><span style="color: #000000;">-</span><span style="color: #000000;">90</span><span style="color: #000000;">));<br>node1</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">pitch(Degree(</span><span style="color: #000000;">-</span><span style="color: #000000;">90</span><span style="color: #000000;">));<br>node1</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">roll(Degree(</span><span style="color: #000000;">-</span><span style="color: #000000;">90</span><span style="color: #000000;">));</span></div>
<br><br><br><img src ="http://www.cppblog.com/eros/aggbug/83455.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/eros/" target="_blank">林公子</a> 2009-05-20 11:48 <a href="http://www.cppblog.com/eros/archive/2009/05/20/83455.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Direct3D材质和灯光小节</title><link>http://www.cppblog.com/eros/archive/2009/05/14/82894.html</link><dc:creator>林公子</dc:creator><author>林公子</author><pubDate>Wed, 13 May 2009 18:53:00 GMT</pubDate><guid>http://www.cppblog.com/eros/archive/2009/05/14/82894.html</guid><wfw:comment>http://www.cppblog.com/eros/comments/82894.html</wfw:comment><comments>http://www.cppblog.com/eros/archive/2009/05/14/82894.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/eros/comments/commentRss/82894.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/eros/services/trackbacks/82894.html</trackback:ping><description><![CDATA[<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000;">mDevice</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">SetRenderState(D3DRS_AMBIENT,&nbsp;</span><span style="color: #000000;">0xffffffff</span><span style="color: #000000;">);</span></div>&nbsp; &nbsp; &nbsp; 光照
<p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt;" class="p0">DirectX<font face="宋体">中有四种光照模型：</font></p>
<p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt;" class="p0">环境光：环境光没有方向和位置上的特征，只有一个颜色亮度值，不会衰减，所以在所有方向和所有物体表面投射的环境光的数量是恒定不变的。</p>
<p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt;" class="p0">漫反射：漫反射在生活中最为普遍，太阳光的直射，日光灯的照射都可以用漫反射光来模拟。漫反射由光的方向和物体表面的法向量决定。漫反射光的空间位置和方向对物体的照明有很大的影响。</p>
<p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt;" class="p0">镜面反射：当观察金属制品和玻璃制品的表面时，改变观察点的位置，会发现物体表面的亮度也会发生变化，这种现象称之为镜面反射。</p>
<p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt;" class="p0">自发光：就是物体自身发光，通过设置材质的自发光属性<font face="Times New Roman">Emissive</font><font face="宋体">（颜色和透明度）来实现。自发光可以影响一个对象的颜色。可以使用材质的自发光来实现发光的对象，而不用在场景中添加灯光，减少了计算量。</font></p>
<p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt;" class="p0">用自发光属性创建的材质并不发射能被场景中其他物体反射的光，也就是说自发光不参与光照计算。</p>
<p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt;" class="p0"></p>
<p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt;" class="p0">有三种光源</p>
<p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt;" class="p0">点光源：点光源有颜色和位置，但是没有方向，它向所有方向发射的光都一样。在程序中需要提供点光源的颜色，位置，衰减系数等参数。</p>
<p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt;" class="p0">电灯泡是点光源的一个例子。这种光的强度会随着距离物体的远近而衰减。</p>
<p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt;" class="p0"></p>
<p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt;" class="p0">方向光：只有方向和颜色属性的光源，没有位置，衰减。可以想象成从无穷远处发来的光，例如太阳光。</p>
<p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt;" class="p0"></p>
<p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt;" class="p0">聚光灯：聚光灯有颜色，位置，方向，类似现实中的探照灯。聚光灯又一个明亮的内椎体和大一点的外椎体组成。光的强度从内椎体到外椎体逐渐衰减，衰减的规律由<font face="Times New Roman">Falloff,Theta(</font><font face="宋体">内锥角）和</font><font face="Times New Roman">Phi</font><font face="宋体">（外锥角）三个属性共同决定。</font></p>
<p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt;" class="p0"></p>
<p style="margin-top: 0pt; margin-bottom: 0pt;" class="p0">&nbsp;&nbsp;&nbsp; DirectX<font face="宋体">中物体的颜色由光的颜色和材质的颜色共同决定</font><font face="Times New Roman">(</font><font face="宋体">和现实世界情况不同）。</font></p>
<p style="margin-top: 0pt; margin-bottom: 0pt;" class="p0">&nbsp;&nbsp;&nbsp; 默认情况下，D3D中的灯光是开启的，就是说写:<br />
</p>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; width: 98%; font-size: 13px;">mDevice-&gt;Set<img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top" alt="" />RenderState(D3DRS_LIGHTING,&nbsp;TRUE);</div>
&nbsp;&nbsp;&nbsp;
和忽略这一句效果一样。<br />&nbsp;&nbsp;&nbsp; <br />
<p>&nbsp;</p>
<p style="margin-top: 0pt; margin-bottom: 0pt;" class="p0">&nbsp;&nbsp;&nbsp; 如果要禁用灯光，就将这句代码中的TRUE改为FALSE。<br /></p>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000;">1 mDevice</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">SetRenderState(D3DRS_LIGHTING,&nbsp;FALSE);</span></div>
&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; 如果禁用灯光，那么任何的材质设置都不会有效果。
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000;">2 mDevice</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">SetRenderState(D3DRS_AMBIENT,&nbsp;</span><span style="color: #000000;">0xffffffff</span><span style="color: #000000;">);</span></div>
&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; 关于这两句代码(编号为1和2)，又有几种情况:<br />&nbsp;&nbsp;&nbsp; 1)1为FALSE时，启用2，那么会获得一个环境光照明，此时设置材质无效(渲染对象为白色)，纹理可以正常显示(如果有纹理)。<br />&nbsp;&nbsp;&nbsp; 2)1为TRUE时，启用2，材质设置有效，会影响渲染结果，纹理可以正常显示。<br />&nbsp;&nbsp;&nbsp; 3)1为FALSE时，禁用2，材质设置失效，纹理可以正常显示。<br />&nbsp;&nbsp;&nbsp; 4)1为TRUE时，禁用2，材质设置失效，纹理无法显示(渲染对象为黑色)。<br /><br />&nbsp; &nbsp;P.S.以上所说的材质指的是D3DMATERIAL9，不包括顶点色。带有顶点色时，1为TRUE时渲染为黑色，FALSE时为正常，和2的状态无关。<br /><br />&nbsp;&nbsp;&nbsp; 结论：当开启光照时，必须指定一种光源才能使渲染对象正确绘制(渲染状态设置的环境光或者其他3种类型的光源)。<br />
<p>&nbsp;</p>
<p style="margin-top: 0pt; margin-bottom: 0pt;" class="p0"></p><img src ="http://www.cppblog.com/eros/aggbug/82894.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/eros/" target="_blank">林公子</a> 2009-05-14 02:53 <a href="http://www.cppblog.com/eros/archive/2009/05/14/82894.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在Qt中使用DirectX</title><link>http://www.cppblog.com/eros/archive/2009/05/13/82758.html</link><dc:creator>林公子</dc:creator><author>林公子</author><pubDate>Tue, 12 May 2009 22:40:00 GMT</pubDate><guid>http://www.cppblog.com/eros/archive/2009/05/13/82758.html</guid><wfw:comment>http://www.cppblog.com/eros/comments/82758.html</wfw:comment><comments>http://www.cppblog.com/eros/archive/2009/05/13/82758.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/eros/comments/commentRss/82758.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/eros/services/trackbacks/82758.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp; 本文大部分内容转自七星重剑的在Qt窗口里用D3D画转动的三角形一文，加上点滴个人研究笔记。&nbsp; 先上个自己的运行结果图吧：&nbsp; &nbsp; 现在的问题是只有&#8220;脏&#8221;了才画，也就是才去调用如下的method；不是三角形没动，是动了但是没画出来，我们看不见。Code highlighting produced by Actipro Code...&nbsp;&nbsp;<a href='http://www.cppblog.com/eros/archive/2009/05/13/82758.html'>阅读全文</a><img src ="http://www.cppblog.com/eros/aggbug/82758.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/eros/" target="_blank">林公子</a> 2009-05-13 06:40 <a href="http://www.cppblog.com/eros/archive/2009/05/13/82758.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Luabind导出类到lua</title><link>http://www.cppblog.com/eros/archive/2009/05/02/81661.html</link><dc:creator>林公子</dc:creator><author>林公子</author><pubDate>Fri, 01 May 2009 17:32:00 GMT</pubDate><guid>http://www.cppblog.com/eros/archive/2009/05/02/81661.html</guid><wfw:comment>http://www.cppblog.com/eros/comments/81661.html</wfw:comment><comments>http://www.cppblog.com/eros/archive/2009/05/02/81661.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.cppblog.com/eros/comments/commentRss/81661.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/eros/services/trackbacks/81661.html</trackback:ping><description><![CDATA[<span style="FONT-FAMILY: 微软雅黑">&nbsp; 刚开始学习Luabind，所以算是一些简单的笔记。<br>&nbsp; 使用Luabind前要包含相关的头文件，引入luabind命名空间。注意包含luabind.hpp并不会自动包含lua相关头文件，要根据需要自己添加。</span><br>&nbsp;
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="COLOR: #000000">#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">luabind</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">luabind.hpp</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br><br></span><span style="COLOR: #0000ff">extern</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">C</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><br>{<br>#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">lua.h</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br>#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">lualib.h</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br>}<br><br></span><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">namespace</span><span style="COLOR: #000000">&nbsp;luabind;</span></div>
<br>&nbsp; 假设有以下类定义：<br>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="COLOR: #008080">&nbsp;1</span>&nbsp;<span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;TestClass.h</span><span style="COLOR: #008000"><br></span><span style="COLOR: #008080">&nbsp;2</span>&nbsp;<span style="COLOR: #008000"></span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;TestClass<br></span><span style="COLOR: #008080">&nbsp;3</span>&nbsp;<span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">&nbsp;4</span>&nbsp;<span style="COLOR: #000000"></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">:<br></span><span style="COLOR: #008080">&nbsp;5</span>&nbsp;<span style="COLOR: #000000"><br></span><span style="COLOR: #008080">&nbsp;6</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;TestClass(</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&nbsp;s);<br></span><span style="COLOR: #008080">&nbsp;7</span>&nbsp;<span style="COLOR: #000000"><br></span><span style="COLOR: #008080">&nbsp;8</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000">&nbsp;TestClass</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;Singleton();<br></span><span style="COLOR: #008080">&nbsp;9</span>&nbsp;<span style="COLOR: #000000"><br></span><span style="COLOR: #008080">10</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;Print();<br></span><span style="COLOR: #008080">11</span>&nbsp;<span style="COLOR: #000000"><br></span><span style="COLOR: #008080">12</span>&nbsp;<span style="COLOR: #000000"></span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000">:<br></span><span style="COLOR: #008080">13</span>&nbsp;<span style="COLOR: #000000"><br></span><span style="COLOR: #008080">14</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000">&nbsp;TestClass</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;mSingleton;<br></span><span style="COLOR: #008080">15</span>&nbsp;<span style="COLOR: #000000"><br></span><span style="COLOR: #008080">16</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&nbsp;mString;<br></span><span style="COLOR: #008080">17</span>&nbsp;<span style="COLOR: #000000">};<br></span><span style="COLOR: #008080">18</span>&nbsp;<span style="COLOR: #000000"><br></span><span style="COLOR: #008080">19</span>&nbsp;<span style="COLOR: #000000"></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;TestClass.cpp</span><span style="COLOR: #008000"><br></span><span style="COLOR: #008080">20</span>&nbsp;<span style="COLOR: #008000"></span><span style="COLOR: #000000">TestClass</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;TestClass::mSingleton&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;NULL;<br></span><span style="COLOR: #008080">21</span>&nbsp;<span style="COLOR: #000000"><br></span><span style="COLOR: #008080">22</span>&nbsp;<span style="COLOR: #000000">TestClass::TestClass(</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&nbsp;s)<br></span><span style="COLOR: #008080">23</span>&nbsp;<span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">24</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;mString&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;s;<br></span><span style="COLOR: #008080">25</span>&nbsp;<span style="COLOR: #000000">}<br></span><span style="COLOR: #008080">26</span>&nbsp;<span style="COLOR: #000000"><br></span><span style="COLOR: #008080">27</span>&nbsp;<span style="COLOR: #000000">TestClass</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;TestClass::Singleton()<br></span><span style="COLOR: #008080">28</span>&nbsp;<span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">29</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(TestClass::mSingleton&nbsp;</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">&nbsp;NULL)<br></span><span style="COLOR: #008080">30</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;{<br></span><span style="COLOR: #008080">31</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;TestClass(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Hello</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br></span><span style="COLOR: #008080">32</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="COLOR: #008080">33</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">34</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;{<br></span><span style="COLOR: #008080">35</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;mSingleton;<br></span><span style="COLOR: #008080">36</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="COLOR: #008080">37</span>&nbsp;<span style="COLOR: #000000">}<br></span><span style="COLOR: #008080">38</span>&nbsp;<span style="COLOR: #000000"><br></span><span style="COLOR: #008080">39</span>&nbsp;<span style="COLOR: #000000"></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;TestClass::Print()<br></span><span style="COLOR: #008080">40</span>&nbsp;<span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">41</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;mString&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;endl;<br></span><span style="COLOR: #008080">42</span>&nbsp;<span style="COLOR: #000000">}</span></div>
&nbsp; <br>&nbsp; <span style="FONT-FAMILY: 微软雅黑">创建一个bindClass函数，用来进行导出类的相关工作</span><br>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="COLOR: #008080">&nbsp;1</span>&nbsp;<span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;bindClass(lua_State</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;L)<br></span><span style="COLOR: #008080">&nbsp;2</span>&nbsp;<span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">&nbsp;3</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;open(L);<br></span><span style="COLOR: #008080">&nbsp;4</span>&nbsp;<span style="COLOR: #000000"><br></span><span style="COLOR: #008080">&nbsp;5</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;module(L)<br></span><span style="COLOR: #008080">&nbsp;6</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[<br></span><span style="COLOR: #008080">&nbsp;7</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;class_</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">TestClass</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">TestClass</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">)<br></span><span style="COLOR: #008080">&nbsp;8</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.def(constructor</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">())<br></span><span style="COLOR: #008080">&nbsp;9</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.def(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Print</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">TestClass::Print),<br></span><span style="COLOR: #008080">10</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;def(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Singleton</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp; </span><span style="COLOR: #000000"></span><span style="COLOR: #000000">TestClass::Singleton)&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;请注意static成员函数Singleton()导出时和非静态成员函数的写法区别，<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 和全局函数的导出写法一样。</span><span style="COLOR: #008000"><br></span><span style="COLOR: #008080">11</span>&nbsp;<span style="COLOR: #008000"></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;];<br></span><span style="COLOR: #008080">12</span>&nbsp;<span style="COLOR: #000000"><br></span><span style="COLOR: #008080">13</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">14</span>&nbsp;<span style="COLOR: #000000">}</span></div>
&nbsp; def<span style="FONT-FAMILY: 微软雅黑">模版类中定义导出函数时，成员函数指针一定要用取地址符</span>&amp;，<span style="COLOR: #000000">如TestClass::Print</span>()。<span style="FONT-FAMILY: 微软雅黑">而自由函数和静态函数可用可不用，如</span><span style="COLOR: #000000">TestClass::Singleton()。<br>&nbsp; <span style="FONT-FAMILY: 微软雅黑">现在就可以写代码测试了：</span><br>// test.lua<br>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="COLOR: #008080">1</span>&nbsp;<span style="COLOR: #000000">testClass&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;Singleton()<br></span><span style="COLOR: #008080">2</span>&nbsp;<span style="COLOR: #000000">testClass:Print()</span></div>
<br>// main.cpp<br>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="COLOR: #008080">&nbsp;1</span>&nbsp;<span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;_tmain(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;argc,&nbsp;_TCHAR</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;argv[])<br></span><span style="COLOR: #008080">&nbsp;2</span>&nbsp;<span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">&nbsp;3</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;TestClass&nbsp;testClass(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Hello&nbsp;from&nbsp;lua.</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br></span><span style="COLOR: #008080">&nbsp;4</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">&nbsp;5</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;lua_State</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;L&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;luaL_newstate();<br></span><span style="COLOR: #008080">&nbsp;6</span>&nbsp;<span style="COLOR: #000000"><br></span><span style="COLOR: #008080">&nbsp;7</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;init(L);<br></span><span style="COLOR: #008080">&nbsp;8</span>&nbsp;<span style="COLOR: #000000"><br></span><span style="COLOR: #008080">&nbsp;9</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;luaL_dofile(L,&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">add.lua</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br></span><span style="COLOR: #008080">10</span>&nbsp;<span style="COLOR: #000000"><br></span><span style="COLOR: #008080">11</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;lua_close(L);<br></span><span style="COLOR: #008080">12</span>&nbsp;<span style="COLOR: #000000"><br></span><span style="COLOR: #008080">13</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">14</span>&nbsp;<span style="COLOR: #000000">}<br></span><span style="COLOR: #008080">15</span>&nbsp;<span style="COLOR: #000000"></span></div>
&nbsp; <span style="FONT-FAMILY: 微软雅黑">运行结果：</span><br><img alt="" src="http://www.cppblog.com/images/cppblog_com/eros/10412/r_result.jpg"><br></span>
<img src ="http://www.cppblog.com/eros/aggbug/81661.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/eros/" target="_blank">林公子</a> 2009-05-02 01:32 <a href="http://www.cppblog.com/eros/archive/2009/05/02/81661.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>VS2008下编译luabind 0.8.1</title><link>http://www.cppblog.com/eros/archive/2009/04/29/81508.html</link><dc:creator>林公子</dc:creator><author>林公子</author><pubDate>Wed, 29 Apr 2009 15:31:00 GMT</pubDate><guid>http://www.cppblog.com/eros/archive/2009/04/29/81508.html</guid><wfw:comment>http://www.cppblog.com/eros/comments/81508.html</wfw:comment><comments>http://www.cppblog.com/eros/archive/2009/04/29/81508.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.cppblog.com/eros/comments/commentRss/81508.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/eros/services/trackbacks/81508.html</trackback:ping><description><![CDATA[<p><font face=#ce_temp_font#>&nbsp;&nbsp;&nbsp;&nbsp; 学了一段时间Lua，显然直接在项目中使用是很不方便，google了一下，似乎大家都对luabind这个lua包装类青睐有加，于是我也随大势想用用看。<br>&nbsp;&nbsp;&nbsp;&nbsp; 先做好准备工作，下载了luabin 0.8.1源码，Boost 1.3.8源码和lua 5.1.4源码，编译环境是VS2008 SP1。之前在网上看到一些文章说这些开源软件之间的版本依赖比较敏感，可能会有这样那样的问题，动手之前有些惶恐。<br>&nbsp;&nbsp;&nbsp;&nbsp; 幸运的是，编译过程很顺利，如下：<br>&nbsp;&nbsp;&nbsp;&nbsp; 1.编译lua 5.1.4<br>&nbsp;&nbsp;&nbsp;&nbsp; 进入VS2008的命令行工具，定位到lua的源码目录下，执行命令etc\luavs.bat，没什么问题的话很快就可以编译好lua，得到lua51.lib和lua51.dll。<br>&nbsp;&nbsp;&nbsp;&nbsp; 2.编译luabind<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;解压下载回来的luabind压缩包，假设解压到d:\luabind-0.8.1\，Boost解压到d:\boost 1_38_0\，lua解压到d:\lua&nbsp;5.1.4\<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在VS中新建一个静态库项目，将d:\luabind-0.8.1\src下的源码全部添加到项目中，然后在项目中新建luabind和luabind\detail\两个虚拟文件夹，对应的将d:\luabind-0.8.1\luabind和d:\luabind-0.8.1\luabind\detail下的文件添加到文件夹中。<br>&nbsp;&nbsp;&nbsp;&nbsp; 然后为项目添加附加包含目录，右键点击项目节点-&gt;属性-&gt;配置属性-&gt;C\C++标签下，在附加包含目录中填入d:\luabind-0.8.1\；d:\boost 1_38_0\k；d:\lua&nbsp;5.1.4\src\。然后修改项目字符集为多字节字符集。<br>&nbsp;&nbsp;&nbsp;&nbsp; 准备就绪，生成项目。在我的环境中编译很顺利，没有出现任何问题，成功后会得到luabind.lib。<br><br>&nbsp;&nbsp;&nbsp;&nbsp; 接下来就按照惯例来写一个hello world程序作为使用luabind的第一步。<br>&nbsp;&nbsp;&nbsp;&nbsp; 在VS中新建一个控制台项目，类型为DLL，命名项目为Hello World，然后键入以下代码：<br></font></p>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><span style="COLOR: #008080"><font face=#ce_temp_font#>&nbsp;1</font></span><font face=#ce_temp_font#><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #000000">#include&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">stdafx.h</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">&nbsp;2</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">iostream</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">&nbsp;3</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">luabind</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">luabind.hpp</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">&nbsp;4</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><br></span><span style="COLOR: #008080">&nbsp;5</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;greet()<br></span><span style="COLOR: #008080">&nbsp;6</span><span style="COLOR: #000000"><img id=Codehighlighter1_85_120_Open_Image onclick="this.style.display='none'; codehighlighter1_85_120_open_text.style.display=" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" ? codehighlighter1_85_120_closed_text.style.display="'inline';" codehighlighter1_85_120_closed_image.style.display="'inline';" ?none?;?><img style="DISPLAY: none" id=Codehighlighter1_85_120_Closed_Image onclick="this.style.display='none'; codehighlighter1_85_120_closed_text.style.display=" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" ? ?none?;? codehighlighter1_85_120_open_text.style.display="'inline';" codehighlighter1_85_120_open_image.style.display="'inline';"></span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_85_120_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_85_120_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">&nbsp;7</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;std::cout&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">hello&nbsp;world!\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">&nbsp;8</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif">}</span></span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">&nbsp;9</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><br></span><span style="COLOR: #008080">10</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">extern</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">C</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;__declspec(dllexport)&nbsp;init(lua_State</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;L)<br></span><span style="COLOR: #008080">11</span><span style="COLOR: #000000"><img id=Codehighlighter1_179_272_Open_Image onclick="this.style.display='none'; codehighlighter1_179_272_open_text.style.display=" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" ? ?none?;? codehighlighter1_179_272_closed_text.style.display="'inline';" codehighlighter1_179_272_closed_image.style.display="'inline';"><img style="DISPLAY: none" id=Codehighlighter1_179_272_Closed_Image onclick="this.style.display='none'; codehighlighter1_179_272_closed_text.style.display=" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" ? ?none?;? codehighlighter1_179_272_open_text.style.display="'inline';" codehighlighter1_179_272_open_image.style.display="'inline';"></span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_179_272_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_179_272_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">12</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">namespace</span><span style="COLOR: #000000">&nbsp;luabind;<br></span><span style="COLOR: #008080">13</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"><br></span><span style="COLOR: #008080">14</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;open(L);<br></span><span style="COLOR: #008080">15</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"><br></span><span style="COLOR: #008080">16</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;module(L)<br></span><span style="COLOR: #008080">17</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;[<br></span><span style="COLOR: #008080">18</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;def(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">greet</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">greet)<br></span><span style="COLOR: #008080">19</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;];<br></span><span style="COLOR: #008080">20</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"><br></span><span style="COLOR: #008080">21</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">22</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif">}</span></span></font></div>
<p><font face=#ce_temp_font#><br>&nbsp;&nbsp;&nbsp;注意，在Windows环境下init函数之前是要加__declspec(dllexport)才能将函数导出的，而luabind的文档中的环境是linux，默认不用加__declspec(dllexport)也可以导出(就因为这个折腾了我半天才把hello word成功运行)。<br>&nbsp;&nbsp;&nbsp;编译项目，(<span style="FONT-FAMILY: '#ce_temp_font#'; COLOR: rgb(255,0,0); FONT-SIZE: 10.5pt; mso-spacerun: 'yes'"><font style="FONT-SIZE: 12pt" face=宋体>记得将luabind.lib和lua51.lib添加到链接选项中：项目属性-&gt;连接器-&gt;输入-&gt;附加依赖文件，加入luabind.lib和lua51.lib</font></span>)。<br>&nbsp;&nbsp; 将hello world.dll放到lua51.dll和lua.exe所在的目录下。<br>&nbsp;&nbsp;&nbsp;打开lua命令行，键入:<br>&nbsp;&nbsp;&nbsp;&nbsp; <img border=0 alt="" src="http://www.cppblog.com/images/cppblog_com/eros/10412/r_Hello%20World.bmp" width=413 height=104><br>&nbsp;&nbsp; 测试成功，enjoy。</font></p>
<img src ="http://www.cppblog.com/eros/aggbug/81508.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/eros/" target="_blank">林公子</a> 2009-04-29 23:31 <a href="http://www.cppblog.com/eros/archive/2009/04/29/81508.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SceneNode::setDirection函数问题</title><link>http://www.cppblog.com/eros/archive/2008/12/30/70732.html</link><dc:creator>林公子</dc:creator><author>林公子</author><pubDate>Mon, 29 Dec 2008 17:27:00 GMT</pubDate><guid>http://www.cppblog.com/eros/archive/2008/12/30/70732.html</guid><wfw:comment>http://www.cppblog.com/eros/comments/70732.html</wfw:comment><comments>http://www.cppblog.com/eros/archive/2008/12/30/70732.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/eros/comments/commentRss/70732.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/eros/services/trackbacks/70732.html</trackback:ping><description><![CDATA[<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #000000">mSn</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">translate(mPosition&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;evt.timeSinceLastFrame,&nbsp;Node::TS_WORLD);</span></div>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="FONT-FAMILY: 微软雅黑">刚开始学习Ogre,做了个很简单的demo,用键盘的上下左右控制一个人物模型四处走动。逻辑很简单，但是实现到想要的效果却费了一番周折。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;一开始用一个Vector3 mPosition变量保存人物的位置，然后Real mWalkSpeed保存人物的移动速度，在上下左右的按键响应代码中分别<br>写上处理人物各方向移动的代码：</span><br>
<div>&nbsp;
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;<span style="COLOR: #000000">1&nbsp;&nbsp;&nbsp; </span><span style="COLOR: #0000ff">bool</span><span style="COLOR: #000000">&nbsp;DemoFrameListener::keyPressed(</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;OIS::KeyEvent&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">arg)<br>&nbsp;&nbsp; </span><span style="COLOR: #000000">2</span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_64_1144_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_64_1144_Open_Text><span style="COLOR: #000000">{<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;</span><span style="COLOR: #000000">3</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">switch</span><span style="COLOR: #000000">&nbsp;(arg.key)<br><img id=Codehighlighter1_95_1118_Open_Image onclick="this.style.display='none'; Codehighlighter1_95_1118_Open_Text.style.display='none'; Codehighlighter1_95_1118_Closed_Image.style.display='inline'; Codehighlighter1_95_1118_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif">&nbsp;</span><span style="COLOR: #000000">4</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_95_1118_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_95_1118_Open_Text><span style="COLOR: #000000">{<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;</span><span style="COLOR: #000000">5</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;按下Escape键，退出程序。</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"></span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">6</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">case</span><span style="COLOR: #000000">&nbsp;OIS::KC_ESCAPE:<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;</span><span style="COLOR: #000000">7</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mContinue&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">false</span><span style="COLOR: #000000">;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;</span><span style="COLOR: #000000">8</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;</span><span style="COLOR: #000000">9</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;W、S、A、D控制人物行走。</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"></span><span style="COLOR: #000000">10</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">case</span><span style="COLOR: #000000">&nbsp;OIS::KC_UP:<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"></span><span style="COLOR: #000000">11</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">case</span><span style="COLOR: #000000">&nbsp;OIS::KC_W:<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"></span><span style="COLOR: #000000">12</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mPosition.z&nbsp;</span><span style="COLOR: #000000">-=</span><span style="COLOR: #000000">&nbsp;mWalkSpeed;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"></span><span style="COLOR: #000000">13</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mSn</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">setDirection(Vector3::NEGATIVE_UNIT_Z);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"></span><span style="COLOR: #000000">14</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;取得模型的"Walk"动画集。</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"></span><span style="COLOR: #000000">15</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mAnimationState&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;mEntity</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">getAnimationState(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Walk</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"></span><span style="COLOR: #000000">16</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">break</span><span style="COLOR: #000000">;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"></span><span style="COLOR: #000000">17</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">case</span><span style="COLOR: #000000">&nbsp;OIS::KC_S:<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"></span><span style="COLOR: #000000">18</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">case</span><span style="COLOR: #000000">&nbsp;OIS::KC_DOWN:<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"></span><span style="COLOR: #000000">19</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mPosition.z&nbsp;</span><span style="COLOR: #000000">+=</span><span style="COLOR: #000000">&nbsp;mWalkSpeed;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"></span><span style="COLOR: #000000">20</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mSn</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">setDirection(Vector3::UNIT_Z);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"></span><span style="COLOR: #000000">21</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;取得模型的"Walk"动画集。</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"></span><span style="COLOR: #000000">22</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mAnimationState&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;mEntity</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">getAnimationState(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Walk</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"></span><span style="COLOR: #000000">23</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">break</span><span style="COLOR: #000000">;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"></span><span style="COLOR: #000000">24</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">case</span><span style="COLOR: #000000">&nbsp;OIS::KC_A:<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"></span><span style="COLOR: #000000">25</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">case</span><span style="COLOR: #000000">&nbsp;OIS::KC_LEFT:<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"></span><span style="COLOR: #000000">26</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;取得模型的"Walk"动画集。</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"></span><span style="COLOR: #000000">27</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mAnimationState&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;mEntity</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">getAnimationState(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Walk</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"></span><span style="COLOR: #000000">28</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mSn</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">setDirection(Vector3::UNIT_X);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"></span><span style="COLOR: #000000">29</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">break</span><span style="COLOR: #000000">;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"></span><span style="COLOR: #000000">30</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">case</span><span style="COLOR: #000000">&nbsp;OIS::KC_D:<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"></span><span style="COLOR: #000000">31</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">case</span><span style="COLOR: #000000">&nbsp;OIS::KC_RIGHT:<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"></span><span style="COLOR: #000000">32</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;取得模型的"Walk"动画集。</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"></span><span style="COLOR: #000000">33</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mAnimationState&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;mEntity</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">getAnimationState(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Walk</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"></span><span style="COLOR: #000000">34</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mSn</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">setDirection(Vector3::NEGATIVE_UNIT_X);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"></span><span style="COLOR: #000000">35</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">break</span><span style="COLOR: #000000">;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif"></span><span style="COLOR: #000000">36</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"></span><span style="COLOR: #000000">37</span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"></span><span style="COLOR: #000000">38</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">true</span><span style="COLOR: #000000">;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif"></span><span style="COLOR: #000000">39</span><span style="COLOR: #000000">}</span></span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #000000">40</span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span></div>
然后在每一帧中调用<br><span style="FONT-FAMILY: 微软雅黑">
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #000000">mSn</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">translate(mPosition&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;evt.timeSinceLastFrame,&nbsp;Node::TS_LOCAL);</span></div>
来更新人物位置。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;编译代码运行，出现了奇怪的效果。初始时人物面朝-Z轴方向，按下后应该面朝+Z轴方向并朝这个方向行走，实际却是面朝+Z方向往-Z轴方向移动。以为逻辑代码写错导致移动方向错误，检查了半天发现一点错误都没有。折腾了两天都没有结果，今天在群里和人聊天时谈到SceneNode::setDirection这个函数，人家说调用SceneNode::setDirection这个函数后会改变模型的局部坐标系，顿时脑子高速运转，隐约觉得离答案已经不远了，自己琢磨的一下，终于解决了问题。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;原来，用一个参数(方向向量)调用setDirection函数时，该函数有两个默认值，我遇到的问题就和第二个参数有关，这个参数描述的是setDirection函数操作的参照空间，有Node::TS_LOCAL,Node::TS_PARENT和Node::TS_WORLD三个可选值，分别表示，局部空间，父节点空间和世界空间。在我的例子中，人物的朝向是以整个地图为参照物的，所以，这个参数应该设置成TS_WORLD，如果取其默认值Node::TS_LOCAL，调用setDirection之后，人物的整个局部坐标系的方向都变了，这样一来，当按下方向键时，人物会面向正确的方向，但是移动的参照方向却和原来的相反，这就是为什么会有正确的朝向却背向移动的奇怪现象了。</span><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;另外<br>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #000000">mSn</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">translate(mPosition&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;evt.timeSinceLastFrame,&nbsp;Node::TS_LOCAL);</span></div>
中的Node::TS_LOCAL也要改成Node::TS_WORLD，使人物相对于世界空间平移。 </div>
<img src ="http://www.cppblog.com/eros/aggbug/70732.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/eros/" target="_blank">林公子</a> 2008-12-30 01:27 <a href="http://www.cppblog.com/eros/archive/2008/12/30/70732.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[ZT]DirectX中的投影变换</title><link>http://www.cppblog.com/eros/archive/2008/11/08/66356.html</link><dc:creator>林公子</dc:creator><author>林公子</author><pubDate>Sat, 08 Nov 2008 12:42:00 GMT</pubDate><guid>http://www.cppblog.com/eros/archive/2008/11/08/66356.html</guid><wfw:comment>http://www.cppblog.com/eros/comments/66356.html</wfw:comment><comments>http://www.cppblog.com/eros/archive/2008/11/08/66356.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/eros/comments/commentRss/66356.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/eros/services/trackbacks/66356.html</trackback:ping><description><![CDATA[<span style="font-family: 微软雅黑;">原贴地址：</span><a style="font-family: 微软雅黑;" target="_blank" href="http://blog.csdn.net/BAKER_LEE/archive/2008/08/20/2801515.aspx">http://blog.csdn.net/BAKER_LEE/archive/2008/08/20/2801515.aspx
</a><br><br style="font-family: 微软雅黑;"><span style="font-family: 微软雅黑;">&nbsp;&nbsp;&nbsp;&nbsp; DirectX中投影变换D3DXMatrixPerspectiveFovLH（）其实产生的变换矩阵不是将3D物体转换为2D平面画面的变换。实际上
是把3D世界的物体变换到(1,1,0) (-1,1,0) (-1,-1,0) (1,-1,0) (1,1,1) (-1,1,1)
(-1,-1,1) (1,-1,1)这个小盒子中。在Jim Adams 的著作&lt;Role playing games with
DriectX 8.0&gt;和Frank Luna 的著作中&lt;Introduction to 3D Game Programming
with
DirectX9.0&gt;都把这个变换矩阵讲成从3D到2D的变换。实际上在DirectX中3D到2D的变换是由SDK自己完成的。而我们要做的是
把3D世界变换到上面那个小盒子中。 </span>
<p style="font-family: 微软雅黑;">这个变换矩阵是投影变换的预变换。</p>
<p style="font-family: 微软雅黑;">在DirectX中，把视口的高作为3D世界里面的长度：2.0f来使用的，一个视点观察世界的视野范围在Y轴上无论什么情况下都是 -1.0f到1.0f（这一点在后面来证明）。把视口的高作为y轴，顶端坐标为（x，1），底端坐标为（x，-1）。</p>
<p style="font-family: 微软雅黑;">视口：在窗体中显示3D的矩形范围，可以通过D3DDevice的SetViewPort（）来设置大小，默认的大小为窗体的大小。</p>
<p style="font-family: 微软雅黑;">变换的过程就是把点的向量乘以变换矩阵，可以得到这个点在新坐标系的对应向量，在投影变换矩阵中Z轴的值落在0~1之内，也就是说3D世界里所有的点都会被投影到以上描述的小盒子中。</p>
<p style="font-family: 微软雅黑;">我们用函数D3DXMatrixPerspectiveFovLH来获得该&#8220;投影变换&#8221;矩阵。</p>
<p style="font-family: 微软雅黑;">D3DXMATRIX * D3DXMatrixPerspectiveFovLH(</p>
<p style="font-family: 微软雅黑;">&nbsp;D3DXMATRIX *<em> pOut</em> ,</p>
<p style="font-family: 微软雅黑;">&nbsp;FLOAT <em> fovy</em> ,</p>
<p style="font-family: 微软雅黑;">&nbsp;FLOAT <em> Aspect</em> ,</p>
<p style="font-family: 微软雅黑;">&nbsp;FLOAT <em> zn</em> ,</p>
<p style="font-family: 微软雅黑;">&nbsp;FLOAT <em> zf</em> </p>
<p style="font-family: 微软雅黑;">);</p>
<p style="font-family: 微软雅黑;">其中参数fovy为y轴上的视角，Aspect为高宽比，zn为近裁面，zf为远裁面。</p>
<p style="font-family: 微软雅黑;">Y轴的视角：在DirectX的帮助文档中描述fovy为filed of view in y direction。</p>
<p style="font-family: 微软雅黑;">高宽比：一般用于全屏显示，如果我们要让3D世界充满整个窗口，就必须让高宽比等于窗口的高宽比，例如让我们的窗口正常显示&#8221;标准视野&#8221;[2X2
的一个面,顶点坐标为（1，1），（-1，1），（-1，-1），（1，-1）]，我们必须把窗口的高宽比设置成1：1，这样，标准视野就可以充满整个窗
口，否则
会在左右留出空白，这个空白是无法用VIEW，WORLD变换所能填充的，相当于word文档采用&#8220;文档&#8221;视图里面的两边的灰色区域，是无法编辑的，在一
般的3D程序里面是不允许出现这种情况的，但是我们的显示器的高宽比不是1：1，而且大部分的用户也不习惯用1：1的窗口来使用程序，我们需要调整这个标
准视野，来适应我们的窗口大小，Aspect就是这个作用，有一点需要说明的Aspect不等于1，不代表标准视野就不是（1，1），（-1，1），
（-1，-1），（1，-1），如果Aspect = 0.5
标准视野也还是（1，1），（-1，1），（-1，-1），（1，-1），只不过x轴上的单位长度的像素值 是 y轴上单位长度的像素值的2倍。</p>
<p style="font-family: 微软雅黑;">&nbsp;</p>
<p style="font-family: 微软雅黑;">裁面的作用: 在Z轴方向上，不显示z坐标小于zn的或者大于 zf的点。</p>
<p style="font-family: 微软雅黑;"><img alt="" src="http://images.cnblogs.com/cnblogs_com/baker_lee/projection2.JPG" border="0" width="297" height="203"></p>
<span style="font-family: 微软雅黑;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在上图中，紫红色的线为我们要显示的面，红色的弧就是上面函数fovy</span><font style="font-family: 微软雅黑;" face="Times New Roman">的夹角，当这个夹角为90&#176;的时候，我们窗口的视野为标准视野，<span style="color: red;">当夹角缩小时，可视范围就变小，如图，从90&#176;变为60&#176;的时候，可视范围变小了，要显示的面，相对于可以范围变大了，由于我们的窗口是不变的，也就是说实际显示的像素值不变，要显示的面就相对于变大，fovy的值变小的结果就是把要显示的面变大。</span> </font>
<p style="font-family: 微软雅黑;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;当fovy为0的时候呢，视野就为0，就是说什么都看不到，窗口中显示的就是底色。</p>
<p style="font-family: 微软雅黑;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;当fovy变大至180&#176;的时候呢？视野的范围为视线夹角上的垂直于Z轴的且过点（0，0，1）的连线。当视线夹角变大视野范围也变大，夹角趋近于180&#176;的时候视野范围趋近于无穷大，要显示的面相对于视野范围就是0，也就是说缩小到最小就是0.所以我们在设定fovy的值为180&#176;的时候也是什么都看不见，为底色。</p>
<p style="font-family: 微软雅黑;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;那大于180&#176;的情况呢？在我们的视野理论上是不存在这种情况的，当视角大于180&#176;时，视角于Z轴垂直的连线是不会过点（0，0，1）的。但是函数放在我们面前，我们是可以输入大于180&#176;的数值，结果会如何呢？</p>
<p style="font-family: 微软雅黑;">非常神奇的事情发生了，我们的图以原点为中心旋转了180&#176;！这是无法用我们的视野理论来解释的,因为180&#176;的视野范围就已经是个极限了，&#8220;超越极限&#8221;是只能在广告中出现的词汇（如果能超越，那就不叫极限了：P）。</p>
<p style="font-family: 微软雅黑;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在MSDN的文档中有这样一个数学公式：y-scale = cot（fovy/2）</p>
<p style="font-family: 微软雅黑;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;这下就明白了，当我们输入大于180&#176;的时候cot的值为负数。而x-scale = y-scale/ Aspect。.</p>
<p style="font-family: 微软雅黑;">也就是说，一个3D世界的点，在视野大于180&#176;的作用下，它的放大/缩小倍数不变，但是需要对X轴做一次对称变换，还要对Y轴做一次对称变换。相当于对原点做一次对称变换。</p>
<p style="font-family: 微软雅黑;">拿到这个公式，我们就可以对前面的标准做一个证明：</p>
<p style="font-family: 微软雅黑;">当fovy为90&#176; Aspect = 1的时候，就是说y-scale = cot（45&#176;） = 1 </p>
<p style="font-family: 微软雅黑;">x-scale = 1，这时y和x的缩放比都为1，没有缩放。我们显示这样一个面</p>
<p style="font-family: 微软雅黑;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {-1.0f, -1.0f, 0.0f},</p>
<p style="font-family: 微软雅黑;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {-1.0f, 1.0f, 0.0f},</p>
<p style="font-family: 微软雅黑;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { 1.0f, 1.0f, 0.0f},</p>
<p style="font-family: 微软雅黑;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {-1.0f, -1.0f, 0.0f},</p>
<p style="font-family: 微软雅黑;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { 1.0f, 1.0f, 0.0f},</p>
<p style="font-family: 微软雅黑;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { 1.0f,-1.0f, 0.0f}</p>
<p style="font-family: 微软雅黑;">&nbsp;&nbsp;&nbsp;&nbsp; 我们会发现无论怎么改变窗口的高度，这个画面的Y轴方向上都会充满整个视口。（如果我们把视口的高度和宽度设置成一样的，在X轴上也会充满整个视口）所以DirectX会以视口的高度的二分之一作为Y轴的单位长度。</p>
<br style="font-family: 微软雅黑;"><br>     <img src ="http://www.cppblog.com/eros/aggbug/66356.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/eros/" target="_blank">林公子</a> 2008-11-08 20:42 <a href="http://www.cppblog.com/eros/archive/2008/11/08/66356.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>自定义顶点结构与D3DXCOLOR</title><link>http://www.cppblog.com/eros/archive/2008/11/08/66298.html</link><dc:creator>林公子</dc:creator><author>林公子</author><pubDate>Fri, 07 Nov 2008 20:54:00 GMT</pubDate><guid>http://www.cppblog.com/eros/archive/2008/11/08/66298.html</guid><wfw:comment>http://www.cppblog.com/eros/comments/66298.html</wfw:comment><comments>http://www.cppblog.com/eros/archive/2008/11/08/66298.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/eros/comments/commentRss/66298.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/eros/services/trackbacks/66298.html</trackback:ping><description><![CDATA[&nbsp;&nbsp; <span style="font-family: 微软雅黑;">最近系统的学习Direct3D</span>，<span style="font-family: 微软雅黑; ">从DXSDK的例子学起。在Tut02_Vertices例子中，自定义顶点格式为：<br /><div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000ff;">struct</span><span style="color: #000000;">&nbsp;CUSTOMVERTEX<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;FLOAT&nbsp;x,&nbsp;y,&nbsp;z,&nbsp;rhw;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;DWORD&nbsp;color;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">D3DXCOLOR&nbsp;color;</span><span style="color: #008000;"><br /></span><span style="color: #000000;">};<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;初始化顶点数据</span><span style="color: #008000;"><br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;CUSTOMVERTEX&nbsp;vertices[]&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;"><br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;</span><span style="color: #000000;">150.0f</span><span style="color: #000000;">,&nbsp;&nbsp;</span><span style="color: #000000;">50.0f</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">0.5f</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">1.0f</span><span style="color: #000000;">,&nbsp;D3DXCOLOR(</span><span style="color: #000000;">1.0f</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">0.0f</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">0.0f</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">0.0f</span><span style="color: #000000;">)</span><span style="color: #008000;">/*</span><span style="color: #008000;">0xffff0000</span><span style="color: #008000;">*/</span><span style="color: #000000;">,&nbsp;},&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;x,&nbsp;y,&nbsp;z,&nbsp;rhw,&nbsp;color</span><span style="color: #008000;"><br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;</span><span style="color: #000000;">250.0f</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">250.0f</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">0.5f</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">1.0f</span><span style="color: #000000;">,&nbsp;D3DXCOLOR(</span><span style="color: #000000;">0.0f</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">1.0f</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">0.0f</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">0.0f</span><span style="color: #000000;">)</span><span style="color: #008000;">/*</span><span style="color: #008000;">0xff00ff00</span><span style="color: #008000;">*/</span><span style="color: #000000;">,&nbsp;},<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;</span><span style="color: #000000;">50.0f</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">250.0f</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">0.5f</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">1.0f</span><span style="color: #000000;">,&nbsp;D3DXCOLOR(</span><span style="color: #000000;">0.0f</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">0.0f</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">1.0f</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">0.0f</span><span style="color: #000000;">)</span><span style="color: #008000;">/*</span><span style="color: #008000;">0xff00ffff</span><span style="color: #008000;">*/</span><span style="color: #000000;">,&nbsp;},<br />&nbsp;&nbsp;&nbsp;&nbsp;};</span></div>
&nbsp;&nbsp;&nbsp;&nbsp; 自定义格式结构体中注释掉的是我后来想用的D3DXCOLOR。原本以为将原先定义的DWORD颜色换成D3DXCOLOR类型，然后初始化的时候相应做替换就可以了，谁知道，渲染出来的三角形顶点颜色异常：<br />&nbsp;&nbsp;&nbsp;&nbsp; <img src="http://www.cppblog.com/images/cppblog_com/eros/wrong.JPG" alt="wrong.JPG" border="0" width="200" height="200" /><br />&nbsp;&nbsp;&nbsp;&nbsp; 正常的应该是这样<br />&nbsp;&nbsp;&nbsp;&nbsp; <img src="http://www.cppblog.com/images/cppblog_com/eros/right.JPG" alt="right.JPG" border="0" width="200" height="200" /><br />&nbsp;&nbsp;&nbsp;&nbsp; 百思不得其解，郁闷至极。后来终于在GameDev.net上找到近似案例(</span><span style="color: #3366ff; "><a href="http://www.gamedev.net/topic/443442-d3dfvf-mesh-showing-up-all-crazy-colors/">这里</a></span><span style="font-family: 微软雅黑;">)，琢磨一番，恍然大悟。<br />&nbsp;&nbsp;&nbsp;&nbsp; 原来，在FVF顶点格式中，D3D需要特定的内存布局，就是说，你的顶点格式中各项的类型应该满足它的期望。比如，它要求的颜色值应该是DWORD类型的32位整数值，而替换成D3DXCOLOR之后，却变成了4个float类型值(r, g, b，a)，与其期望不符，所以导致了异常的颜色。顶点结构体中颜色值还是换回DWORD类型，代码中的赋值可以正常使用，因为D3DXCOLOR有到DWORD的自动转换。<br /></span><img src ="http://www.cppblog.com/eros/aggbug/66298.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/eros/" target="_blank">林公子</a> 2008-11-08 04:54 <a href="http://www.cppblog.com/eros/archive/2008/11/08/66298.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>D3D中D3DFVF_XYZ和D3DFVF_XYZRHW的区别</title><link>http://www.cppblog.com/eros/archive/2008/07/14/56128.html</link><dc:creator>林公子</dc:creator><author>林公子</author><pubDate>Mon, 14 Jul 2008 12:48:00 GMT</pubDate><guid>http://www.cppblog.com/eros/archive/2008/07/14/56128.html</guid><wfw:comment>http://www.cppblog.com/eros/comments/56128.html</wfw:comment><comments>http://www.cppblog.com/eros/archive/2008/07/14/56128.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/eros/comments/commentRss/56128.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/eros/services/trackbacks/56128.html</trackback:ping><description><![CDATA[<p style="FONT-FAMILY: 微软雅黑">&nbsp;&nbsp; 学习D3D9的时候遇到灵活顶点格式(FVF)中D3DFVF_XYZRHW和D3DFVF_XYZ之间差异而引起的问题。<br>参看了<span style="FONT-FAMILY: 微软雅黑">同是C++博客的一篇博文,其分析如下:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;The RHW value, which stands for Reciprocal of Homogeneous W[<font color=#800000>1</font>], tells Direct3D that the vertices that are being used are already in screen coordinates. This value is normally used in fog and clipping calculations and should be set to 1.0.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在顶点结构体中没有RHW时，Direct3D将执行视、投影、世界等变换以及进行光线计算，之后你才能在窗口中得到你所绘制的物体。当顶点结构体中有RHW时，就像上面那段英文所述，告知Direct3D使用的顶点已经在屏幕坐标系中了，不再执行视图、投影、世界等变换和光线计算，因为D3DFVF_XYZRHW标志告诉它顶点已经经过了这些处理，并直接将顶点进行光栅操作，任何用SetTransform进行的转换都对其无效。不过这时的原点就在客户区的左上角了，其中x向右为正，y向下为正，而z的意义已经变为z-buffer的象素深度。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 值得注意的是D3DFVF_XYZRHW和D3DFVF_XYZ、D3DFVF_NORMAL不能共存，因为后两个标志与前一个矛盾。在使用这种顶点时，系统需要顶点的位</span>置已经经过变换了，也就是说x、y必须在屏幕坐标系中，z必须是z-buffer中的象素深度，取值范围：0.0－1.0，离观察者最近的地方为0.0，观察范围内最远可见的地方为1.0。<br>---------------------------------------------------------------------------------------------------------------------------------------------------------------<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 结合我自己的试验，有一些发现，记录下来以备忘。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; D3DFVF_XYZ默认的用户区中心坐标是（0，0），而D3DFVF_XYZRHW是左上角为（0，0）<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 用D3DFVF_XYZ默认的为非光照的，而D3DFVF_XYZRHW是高洛德光照。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当使用D3DFVF_XYZ时，要设置渲染状态：</p>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="COLOR: #000000">g_pd3dDevice</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">SetRenderState(D3DRS_LIGHTING,FALSE)<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span></div>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="FONT-FAMILY: 微软雅黑">而且要设置观察矩阵和投影矩阵，例如：</span><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><img style="WIDTH: 11px; HEIGHT: 16px" align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" width=11 height=16>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="COLOR: #000000">D3DXMATRIX&nbsp;matProj;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;D3DXMATRIX&nbsp;matView;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;Create&nbsp;and&nbsp;set&nbsp;the&nbsp;projection&nbsp;matrix</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; D3DXMatrixPerspectiveFovLH(</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">matProj,&nbsp;D3DX_PI</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">4.0f</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">1.33333f</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">1.0f</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">1000.0f</span><span style="COLOR: #000000">);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; g_pd3dDevice</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">SetTransform(D3DTS_PROJECTION,&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">matProj);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;Create&nbsp;and&nbsp;set&nbsp;the&nbsp;view&nbsp;matrix</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; D3DXMatrixLookAtLH(</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">matView,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">D3DXVECTOR3(</span><span style="COLOR: #000000">0.0f</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">0.0f</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">500.0f</span><span style="COLOR: #000000">),&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">D3DXVECTOR3(</span><span style="COLOR: #000000">0.0f</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">0.0f</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">0.0f</span><span style="COLOR: #000000">),&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">D3DXVECTOR3(</span><span style="COLOR: #000000">0.0f</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">1.0f</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">0.0f</span><span style="COLOR: #000000">));<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;g_pd3dDevice</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">SetTransform(D3DTS_VIEW,&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">matView);</span></div>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="FONT-FAMILY: 微软雅黑">否则没有渲染结果。</span> 
<img src ="http://www.cppblog.com/eros/aggbug/56128.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/eros/" target="_blank">林公子</a> 2008-07-14 20:48 <a href="http://www.cppblog.com/eros/archive/2008/07/14/56128.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>