﻿<?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++博客-点点滴滴-随笔分类-08 游戏SDK</title><link>http://www.cppblog.com/ming81/category/15287.html</link><description /><language>zh-cn</language><lastBuildDate>Sun, 23 Oct 2011 09:58:08 GMT</lastBuildDate><pubDate>Sun, 23 Oct 2011 09:58:08 GMT</pubDate><ttl>60</ttl><item><title>(地基工)Ogre动画拾取函数优化版本</title><link>http://www.cppblog.com/ming81/archive/2011/09/28/157090.html</link><dc:creator>小胖妹</dc:creator><author>小胖妹</author><pubDate>Wed, 28 Sep 2011 08:39:00 GMT</pubDate><guid>http://www.cppblog.com/ming81/archive/2011/09/28/157090.html</guid><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->bool&nbsp;GraphicalWorld::pickPoint(const&nbsp;Ray&amp;&nbsp;ray,&nbsp;Vector3&nbsp;&amp;hitpoint,&nbs...&nbsp;&nbsp;<a href='http://www.cppblog.com/ming81/archive/2011/09/28/157090.html'>阅读全文</a><img src ="http://www.cppblog.com/ming81/aggbug/157090.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ming81/" target="_blank">小胖妹</a> 2011-09-28 16:39 <a href="http://www.cppblog.com/ming81/archive/2011/09/28/157090.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>(搬运工)Ogre动画拾取函数</title><link>http://www.cppblog.com/ming81/archive/2011/09/20/156312.html</link><dc:creator>小胖妹</dc:creator><author>小胖妹</author><pubDate>Tue, 20 Sep 2011 06:22:00 GMT</pubDate><guid>http://www.cppblog.com/ming81/archive/2011/09/20/156312.html</guid><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->IEntity*&nbsp;GraphicalWorld::pickEntity(const&nbsp;Ray&amp;&nbsp;ray,&nbsp;uint32&nbsp;mask)&nbsp;&nb...&nbsp;&nbsp;<a href='http://www.cppblog.com/ming81/archive/2011/09/20/156312.html'>阅读全文</a><img src ="http://www.cppblog.com/ming81/aggbug/156312.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ming81/" target="_blank">小胖妹</a> 2011-09-20 14:22 <a href="http://www.cppblog.com/ming81/archive/2011/09/20/156312.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>(地基工)OgreNode旋转、位移</title><link>http://www.cppblog.com/ming81/archive/2011/04/27/145157.html</link><dc:creator>小胖妹</dc:creator><author>小胖妹</author><pubDate>Wed, 27 Apr 2011 08:54:00 GMT</pubDate><guid>http://www.cppblog.com/ming81/archive/2011/04/27/145157.html</guid><description><![CDATA[<p>&nbsp;</p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #000000">&nbsp;&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;Node::rotate(</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;Quaternion</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;q,&nbsp;TransformSpace&nbsp;relativeTo)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;Normalise&nbsp;quaternion&nbsp;to&nbsp;avoid&nbsp;drift</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Quaternion&nbsp;qnorm&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;q;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;qnorm.normalise();<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">switch</span><span style="COLOR: #000000">(relativeTo)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">case</span><span style="COLOR: #000000">&nbsp;TS_PARENT:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;Rotations&nbsp;are&nbsp;normally&nbsp;relative&nbsp;to&nbsp;local&nbsp;axes,&nbsp;transform&nbsp;up</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mOrientation&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;qnorm&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;mOrientation;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">break</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">case</span><span style="COLOR: #000000">&nbsp;TS_WORLD:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;Rotations&nbsp;are&nbsp;normally&nbsp;relative&nbsp;to&nbsp;local&nbsp;axes,&nbsp;transform&nbsp;up</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mOrientation&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;mOrientation&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;_getDerivedOrientation().Inverse()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;qnorm&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;_getDerivedOrientation();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">break</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">case</span><span style="COLOR: #000000">&nbsp;TS_LOCAL:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;Note&nbsp;the&nbsp;order&nbsp;of&nbsp;the&nbsp;mult,&nbsp;i.e.&nbsp;q&nbsp;comes&nbsp;after</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mOrientation&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;mOrientation&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;qnorm;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">break</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;needUpdate();<br>&nbsp;&nbsp;&nbsp;&nbsp;}</span></div>
旋转是本地坐标旋转<br><br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">-----------------------------------------------------------------------</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;Node::translate(</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;Vector3</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;d,&nbsp;TransformSpace&nbsp;relativeTo)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">switch</span><span style="COLOR: #000000">(relativeTo)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">case</span><span style="COLOR: #000000">&nbsp;TS_LOCAL:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;position&nbsp;is&nbsp;relative&nbsp;to&nbsp;parent&nbsp;so&nbsp;transform&nbsp;downwards</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mPosition&nbsp;</span><span style="COLOR: #000000">+=</span><span style="COLOR: #000000">&nbsp;mOrientation&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;d;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">break</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">case</span><span style="COLOR: #000000">&nbsp;TS_WORLD:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;position&nbsp;is&nbsp;relative&nbsp;to&nbsp;parent&nbsp;so&nbsp;transform&nbsp;upwards</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(mParent)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mPosition&nbsp;</span><span style="COLOR: #000000">+=</span><span style="COLOR: #000000">&nbsp;(mParent</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">_getDerivedOrientation().Inverse()&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;d)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">&nbsp;mParent</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">_getDerivedScale();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mPosition&nbsp;</span><span style="COLOR: #000000">+=</span><span style="COLOR: #000000">&nbsp;d;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">break</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">case</span><span style="COLOR: #000000">&nbsp;TS_PARENT:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mPosition&nbsp;</span><span style="COLOR: #000000">+=</span><span style="COLOR: #000000">&nbsp;d;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">break</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;needUpdate();<br><br>&nbsp;&nbsp;&nbsp;&nbsp;}</span></div>
变换是相对于父坐标变换<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008000">//</span><span style="COLOR: #008000">-----------------------------------------------------------------------</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;Node::updateFromParentImpl(</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">)&nbsp;</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(mParent)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;Update&nbsp;orientation</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;Quaternion</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;parentOrientation&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;mParent</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">_getDerivedOrientation();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(mInheritOrientation)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&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;Combine&nbsp;orientation&nbsp;with&nbsp;that&nbsp;of&nbsp;parent</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mDerivedOrientation&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;parentOrientation&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;mOrientation;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&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;No&nbsp;inheritence</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mDerivedOrientation&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;mOrientation;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;Update&nbsp;scale</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;Vector3</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;parentScale&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;mParent</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">_getDerivedScale();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(mInheritScale)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&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;Scale&nbsp;own&nbsp;position&nbsp;by&nbsp;parent&nbsp;scale,&nbsp;NB&nbsp;just&nbsp;combine<br>&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;as&nbsp;equivalent&nbsp;axes,&nbsp;no&nbsp;shearing</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mDerivedScale&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;parentScale&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;mScale;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&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;No&nbsp;inheritence</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mDerivedScale&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;mScale;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;Change&nbsp;position&nbsp;vector&nbsp;based&nbsp;on&nbsp;parent's&nbsp;orientation&nbsp;&amp;&nbsp;scale</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mDerivedPosition&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;parentOrientation&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;(parentScale&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;mPosition);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;Add&nbsp;altered&nbsp;position&nbsp;vector&nbsp;to&nbsp;parents</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mDerivedPosition&nbsp;</span><span style="COLOR: #000000">+=</span><span style="COLOR: #000000">&nbsp;mParent</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">_getDerivedPosition();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;Root&nbsp;node,&nbsp;no&nbsp;parent</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mDerivedOrientation&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;mOrientation;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mDerivedPosition&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;mPosition;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mDerivedScale&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;mScale;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mCachedTransformOutOfDate&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">true</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mNeedParentUpdate&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">false</span><span style="COLOR: #000000">;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;}</span></div>
//
<img src ="http://www.cppblog.com/ming81/aggbug/145157.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ming81/" target="_blank">小胖妹</a> 2011-04-27 16:54 <a href="http://www.cppblog.com/ming81/archive/2011/04/27/145157.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>(搬运工)OGRE的空间变换,translate()的陷阱</title><link>http://www.cppblog.com/ming81/archive/2011/04/27/145155.html</link><dc:creator>小胖妹</dc:creator><author>小胖妹</author><pubDate>Wed, 27 Apr 2011 08:31:00 GMT</pubDate><guid>http://www.cppblog.com/ming81/archive/2011/04/27/145155.html</guid><description><![CDATA[<span class=Apple-style-span style="WORD-SPACING: 0px; FONT: medium Simsun; TEXT-TRANSFORM: none; COLOR: rgb(0,0,0); TEXT-INDENT: 0px; WHITE-SPACE: normal; LETTER-SPACING: normal; BORDER-COLLAPSE: separate; orphans: 2; widows: 2; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"><span class=Apple-style-span style="FONT-SIZE: 14px; LINE-HEIGHT: 21px; FONT-FAMILY: verdana, sans-serif; TEXT-ALIGN: left">
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px"><span style="LINE-HEIGHT: 21px; FONT-FAMILY: arial, helvetica, sans-serif">GRE的空间变换,对于新手来说是一个头疼的问题,而其中的陷阱也是一堆一堆,即使我已经爬出这些陷阱,我还是觉得有必要讲一下.</span></p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px"><span style="LINE-HEIGHT: 21px; FONT-FAMILY: arial, helvetica, sans-serif">translate()这个神秘的函数.网上发现一个朋友中了陷阱:</span></p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px"><span style="LINE-HEIGHT: 21px; FONT-FAMILY: arial, helvetica, sans-serif">以下黑体字为论坛某个网友的错误理解:</span></p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px"><span style="LINE-HEIGHT: 21px; FONT-FAMILY: arial, helvetica, sans-serif"><strong>----------------------------------------------------------------------------------------------------------------------------------</strong></span></p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px"><span style="LINE-HEIGHT: 21px; FONT-FAMILY: arial, helvetica, sans-serif"><strong>在CSDN和gameres上都发了这个问题，一直没人解答，不知道这儿怎么样？<br>void createScene() {<span class=Apple-converted-space>&nbsp;</span><br>... //第一个物体(坐标原点)&nbsp;&nbsp;<br>Entity* head = mSceneMgr-&gt;createEntity("object1", "ogrehead.mesh");&nbsp; &nbsp;<br>head-&gt;setMaterialName("Examples/Rockwall");<span class=Apple-converted-space>&nbsp;</span><br>SceneNode* node1 = rootNode-&gt;createChildSceneNode();<br>node1-&gt;attachObject(head);<br><br>//第二个物体<span class=Apple-converted-space>&nbsp;</span><br>head = mSceneMgr-&gt;createEntity("object2", "ogrehead.mesh");<span class=Apple-converted-space>&nbsp;</span><br>SceneNode* node2 = node1-&gt;createChildSceneNode();<span class=Apple-converted-space>&nbsp;</span><br>node2-&gt;attachObject(head);<span class=Apple-converted-space>&nbsp;</span><br>node2-&gt;translate(Vector3(50, 0, 0), SceneNode::TS_PARENT);<span class=Apple-converted-space>&nbsp;</span><br><br>//第三个物体<span class=Apple-converted-space>&nbsp;</span><br>head = mSceneMgr-&gt;createEntity("object3", "ogrehead.mesh");<br>SceneNode* node3 = node2-&gt;createChildSceneNode();<span class=Apple-converted-space>&nbsp;</span><br>node3-&gt;attachObject(head);<br>node3-&gt;translate(Vector3(0, 50, 0), SceneNode::TS_WORLD);<span class=Apple-converted-space>&nbsp;</span><br>node3-&gt;yaw(Degree(90), SceneNode::TS_LOCAL);<span class=Apple-converted-space>&nbsp;</span><br>}<br>按照空间变换分析，node1在原点，node2的世界坐标是(50, 0, 0)，node3的世界坐标是(0, 50, 0)，<br>但是从显示的结果来看node3是(50, 50, 0)，<br>无论用哪个TransformSpace值，结果都是一样的：translate都是相对于parent，旋转都是在loacal中。</strong></span></p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px"><span style="LINE-HEIGHT: 21px; FONT-FAMILY: arial, helvetica, sans-serif"><strong>&nbsp;</strong></span></p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px"><span style="LINE-HEIGHT: 21px; FONT-FAMILY: arial, helvetica, sans-serif"><strong>我对这个参数的理解是：<br>TS_WORLD：不管当前节点是在哪个节点下，他的操作都是相对于世界坐标系的原点的。<br>&nbsp; &nbsp; 如node3是在node2下面，所以他的初始世界坐标应该是(50,0,0)，<br>&nbsp; &nbsp; 如果它translate(Vector3(0, 50, 0), SceneNode::TS_LOCAL)， 世界坐标应该是(50, 50, 0)<br>&nbsp; &nbsp; 如果它translate(Vector3(0, 50, 0), SceneNode::TS_WORLD)， 相对于世界坐标原点的平移，世界坐标应该是(0, 50, 0)</strong></span></p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px"><span style="LINE-HEIGHT: 21px; FONT-FAMILY: arial, helvetica, sans-serif"><strong>-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------</strong></span></p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px"><span style="LINE-HEIGHT: 21px; FONT-FAMILY: arial, helvetica, sans-serif">&nbsp;</span></p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px"><span style="LINE-HEIGHT: 21px; FONT-FAMILY: arial, helvetica, sans-serif">这个网友遇到的问题,其实就是translate变换的问题,为什么他会这么理解,我们慢慢分析:</span></p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px"><span style="LINE-HEIGHT: 21px; FONT-FAMILY: arial, helvetica, sans-serif">&nbsp;</span></p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px"><span style="LINE-HEIGHT: 21px; FONT-FAMILY: arial, helvetica, sans-serif">translate()这个函数,其实是相对于父节点的相对移动,而不是那个网友理解的绝对移动.</span></p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px"><span style="LINE-HEIGHT: 21px; FONT-FAMILY: arial, helvetica, sans-serif">但是如果是相对于父节点的相对移动,还要选择3个参考空间干嘛???</span></p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px"><span style="LINE-HEIGHT: 21px; FONT-FAMILY: arial, helvetica, sans-serif">这就是关键所在,这3个参考空间,是决定相对移动量的方向的,而不是那个网友理解成的移动的位置!!!</span></p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px"><span style="LINE-HEIGHT: 21px; FONT-FAMILY: arial, helvetica, sans-serif">&nbsp;</span></p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px"><span style="LINE-HEIGHT: 21px; FONT-FAMILY: 'arial black', 'avant garde'"><span style="LINE-HEIGHT: 21px; FONT-FAMILY: arial, helvetica, sans-serif">为什么他的代码中的第3个节点无论怎么改变参考空间结果都一样?如果理解成方向,就豁然开朗了.<br>因为世界原点,父节点,他本身,这3个节点的面向的方向都是一样的(默认-Z方向),所以相对移动的值是一样,都是Y方向相对移动50</span></span><span style="LINE-HEIGHT: 21px; FONT-FAMILY: 'arial black', 'avant garde'"><span style="LINE-HEIGHT: 21px; FONT-FAMILY: arial, helvetica, sans-serif"><br><br><span style="LINE-HEIGHT: 21px; FONT-FAMILY: arial, helvetica, sans-serif">如果世界原点,父节点都是默认面向Z正方向,本身节点旋转90度面向Y的方向<br>如果他在本地空间translate(Vector3(0, 50, 0),SceneNode::TS_LOCAL),<br>因为他本身朝向Y, 在本地空间Y方向移动50, 在世界空间,其实就是-Z方向移动了50.</span></span></span></p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px"><span style="LINE-HEIGHT: 21px; FONT-FAMILY: 'arial black', 'avant garde'"><span style="LINE-HEIGHT: 21px; FONT-FAMILY: arial, helvetica, sans-serif">一句话:都是相对父节点移动50单位,而参考空间只是决定这50个单位移动的方向!<br><br>所以参考空间理解成朝向,就对了<br>世界空间----------认定世界原点的朝向为标准朝向,默认-Z方向<br>父节点空间----------认定父节点的朝向为标准朝向<br>本地空间--------------认定本身节点的朝向为标准朝向</span></span></p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px"><span style="LINE-HEIGHT: 21px; FONT-FAMILY: arial, helvetica, sans-serif">&nbsp;</span></p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px"><span style="LINE-HEIGHT: 21px; FONT-FAMILY: 'arial black', 'avant garde'"><span style="LINE-HEIGHT: 21px; FONT-FAMILY: arial, helvetica, sans-serif">那个网友的理解,其实合情合理,他的理解其实就是下面假想的函数:</span></span></p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px"><span style="LINE-HEIGHT: 21px; FONT-FAMILY: 'arial black', 'avant garde'"><span style="LINE-HEIGHT: 21px; FONT-FAMILY: arial, helvetica, sans-serif">setPosition(TS_WORLD);<span class=Apple-converted-space>&nbsp;</span><br>setPosition(TS_PARENT);<span class=Apple-converted-space>&nbsp;</span><br>setPosition(TS_LOCAL);</span></span></p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px"><span style="LINE-HEIGHT: 21px; FONT-FAMILY: 'arial black', 'avant garde'"><span style="LINE-HEIGHT: 21px; FONT-FAMILY: arial, helvetica, sans-serif">可惜这只是假想,设置位置的函数并没有参考空间可以选~~~</span></span></p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px"><span style="LINE-HEIGHT: 21px; FONT-FAMILY: 'arial black', 'avant garde'"><span style="LINE-HEIGHT: 21px; FONT-FAMILY: arial, helvetica, sans-serif">OGRE为什么不设置这样的函数呢?因为其实已经有替代的函数了:</span></span><span style="LINE-HEIGHT: 21px; FONT-FAMILY: 'arial black', 'avant garde'"><span style="LINE-HEIGHT: 21px; FONT-FAMILY: arial, helvetica, sans-serif"><br><span style="LINE-HEIGHT: 21px; FONT-FAMILY: arial, helvetica, sans-serif">setPosition() &nbsp; // 相对父空间坐标</span></span></span></p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px"><span style="LINE-HEIGHT: 21px; FONT-FAMILY: 'arial black', 'avant garde'"><span style="LINE-HEIGHT: 21px; FONT-FAMILY: arial, helvetica, sans-serif">setDerivedPosition()&nbsp; // 世界空间绝对坐标</span></span></p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px"><span style="LINE-HEIGHT: 21px; FONT-FAMILY: 'arial black', 'avant garde'"><span style="LINE-HEIGHT: 21px; FONT-FAMILY: arial, helvetica, sans-serif">而本地空间的设置位置函数根本不需要....</span></span><span style="LINE-HEIGHT: 21px; FONT-FAMILY: 'arial black', 'avant garde'"><span style="LINE-HEIGHT: 21px; FONT-FAMILY: arial, helvetica, sans-serif"><br></span></span></p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px"><span style="LINE-HEIGHT: 21px; FONT-FAMILY: arial, helvetica, sans-serif">&nbsp;</span></p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px"><span style="LINE-HEIGHT: 21px; FONT-FAMILY: arial, helvetica, sans-serif">最后,回头一想,为什么容易把translate()理解错....原因就是translate(TS_PARENT)相对父空间移动<br>的时候,如果把参考空间父空间理解成方向或者位置,2种情况下结果是正好是一样的,巧合啊<br>就是这种巧合,暗藏了一个陷进,让很多人认为理解成位置正好是对的...</span></p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px"><span style="LINE-HEIGHT: 21px; FONT-FAMILY: arial, helvetica, sans-serif">不信看源码:</span></p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px"><span style="LINE-HEIGHT: 21px; FONT-FAMILY: arial, helvetica, sans-serif">&nbsp;</span></p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px"></p>
<span style="LINE-HEIGHT: 21px; FONT-FAMILY: arial, helvetica, sans-serif"></span>
<p>&nbsp;</p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;Node::translate(</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;Vector3</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;d,&nbsp;TransformSpace&nbsp;relativeTo)&nbsp;&nbsp;<br>{&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">switch</span><span style="COLOR: #000000">(relativeTo)&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">case</span><span style="COLOR: #000000">&nbsp;TS_LOCAL:&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;position&nbsp;is&nbsp;relative&nbsp;to&nbsp;parent&nbsp;so&nbsp;transform&nbsp;downwards&nbsp;&nbsp;</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mPosition&nbsp;</span><span style="COLOR: #000000">+=</span><span style="COLOR: #000000">&nbsp;mOrientation&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;d;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">break</span><span style="COLOR: #000000">;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">case</span><span style="COLOR: #000000">&nbsp;TS_WORLD:&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;position&nbsp;is&nbsp;relative&nbsp;to&nbsp;parent&nbsp;so&nbsp;transform&nbsp;upwards&nbsp;&nbsp;</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(mParent)&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mPosition&nbsp;</span><span style="COLOR: #000000">+=</span><span style="COLOR: #000000">&nbsp;(mParent</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">_getDerivedOrientation().Inverse()&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;d)&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">&nbsp;mParent</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">_getDerivedScale();&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000">&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mPosition&nbsp;</span><span style="COLOR: #000000">+=</span><span style="COLOR: #000000">&nbsp;d;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">break</span><span style="COLOR: #000000">;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">case</span><span style="COLOR: #000000">&nbsp;TS_PARENT:&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mPosition&nbsp;</span><span style="COLOR: #000000">+=</span><span style="COLOR: #000000">&nbsp;d;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">break</span><span style="COLOR: #000000">;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;needUpdate();&nbsp;&nbsp;<br>&nbsp;&nbsp;<br>}&nbsp;&nbsp;<br></span></div>
<p>&nbsp;</p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px"><span style="LINE-HEIGHT: 21px; FONT-FAMILY: arial, helvetica, sans-serif">&nbsp;</span></p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px"><span style="LINE-HEIGHT: 21px; FONT-FAMILY: arial, helvetica, sans-serif">&nbsp;</span></p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px"><span style="LINE-HEIGHT: 21px; FONT-FAMILY: arial, helvetica, sans-serif">因为mPosition相对于父节点的位置和方向,</span></p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px"><span style="LINE-HEIGHT: 21px; FONT-FAMILY: arial, helvetica, sans-serif">所以计算结果都要换算成父空间相加.</span></p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px"><span style="LINE-HEIGHT: 21px; FONT-FAMILY: arial, helvetica, sans-serif">&nbsp;</span></p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px"><span style="LINE-HEIGHT: 21px; FONT-FAMILY: arial, helvetica, sans-serif">本地空间,朝本身节点的朝向移动d,换到mPosition的所在的父空间只需要旋转一定角度,</span></p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px"><span style="LINE-HEIGHT: 21px; FONT-FAMILY: arial, helvetica, sans-serif">这个角度应该是本身节点方向和父节点的方向的夹角,正好是mOrientation</span></p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px"><span style="LINE-HEIGHT: 21px; FONT-FAMILY: arial, helvetica, sans-serif">mPosition += mOrientation * d;</span></p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px"><span style="LINE-HEIGHT: 21px; FONT-FAMILY: arial, helvetica, sans-serif">&nbsp;</span></p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px"><span style="LINE-HEIGHT: 21px; FONT-FAMILY: arial, helvetica, sans-serif">世界空间,朝世界原点的朝向移动d ,换到mPosition的所在父空间只需要旋转一定角度,</span></p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px"><span style="LINE-HEIGHT: 21px; FONT-FAMILY: arial, helvetica, sans-serif">这个角度应该是世界原点方向和父节点的方向的夹角,正好是父节点世界绝对角度再取反.</span></p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px"><span style="LINE-HEIGHT: 21px; FONT-FAMILY: arial, helvetica, sans-serif">(为什么要取反,2个四元数相乘是不能交换的,因为世界节点和父节点夹角 != 父节点和世界节点夹角,正好相反)</span></p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px"><span style="LINE-HEIGHT: 21px; FONT-FAMILY: arial, helvetica, sans-serif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mPosition += (mParent-&gt;_getDerivedOrientation().Inverse() * d)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; / mParent-&gt;_getDerivedScale();</span></p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px"><span style="LINE-HEIGHT: 21px; FONT-FAMILY: arial, helvetica, sans-serif">&nbsp;</span></p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px"><span style="LINE-HEIGHT: 21px; FONT-FAMILY: arial, helvetica, sans-serif">父节点空间,朝父节点的朝向移动d ,换到mPosition的所在父空间只需要旋转一定角度,</span></p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px"><span style="LINE-HEIGHT: 21px; FONT-FAMILY: arial, helvetica, sans-serif">父空间转到父空间....其实角度就是一致的</span></p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px"><span style="LINE-HEIGHT: 21px; FONT-FAMILY: arial, helvetica, sans-serif">应该是mPosition += Quaternion::IDENTITY * d;</span></p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px"><span style="LINE-HEIGHT: 21px; FONT-FAMILY: arial, helvetica, sans-serif">等价于mPosition +=&nbsp; d;</span></p>
</span></span>
<img src ="http://www.cppblog.com/ming81/aggbug/145155.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ming81/" target="_blank">小胖妹</a> 2011-04-27 16:31 <a href="http://www.cppblog.com/ming81/archive/2011/04/27/145155.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>(地基工)OIS 问题</title><link>http://www.cppblog.com/ming81/archive/2010/12/15/136500.html</link><dc:creator>小胖妹</dc:creator><author>小胖妹</author><pubDate>Wed, 15 Dec 2010 07:29:00 GMT</pubDate><guid>http://www.cppblog.com/ming81/archive/2010/12/15/136500.html</guid><description><![CDATA[1.当窗口最小化后，单击只有按下无弹起事件<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;MouseDeviceOgreOIS::poll()<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(mMouse)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mMouse</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">capture();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OIS::MouseState</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;state&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;mMouse</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">getMouseState();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">设置鼠标无法改变OIS底层GetDeviceData的数据，造成bug，需要解决。</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;POINT&nbsp;point;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GetCursorPos(</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">point);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ScreenToClient((HWND)mWhd,&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">point);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Vector3&nbsp;pos(point.x&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1.0f</span><span style="COLOR: #000000">,&nbsp;point.y&nbsp;</span><span style="COLOR: #000000">*</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>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mPosition.x&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;state.X.abs&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;&nbsp;</span><span style="COLOR: #000000">1.0f</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mPosition.y&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;state.Y.abs&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;&nbsp;</span><span style="COLOR: #000000">1.0f</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mPosition.z&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;state.Z.abs&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;&nbsp;</span><span style="COLOR: #000000">1.0f</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;((mPosition.x&nbsp;</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">&nbsp;pos.x)&nbsp;</span><span style="COLOR: #000000">||</span><span style="COLOR: #000000">&nbsp;(mPosition.y&nbsp;</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">&nbsp;pos.y))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mPosition.x&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;pos.x;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mPosition.y&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;pos.y;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #000000">!</span><span style="COLOR: #000000">mActualClip.contains(mPosition))</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">修改OISBug，当在最小化后，单击只有按下无弹起事件。</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(mButtons[MBT_LEFT])<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mButtons[MBT_LEFT]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;state.buttonDown(OIS::MB_Left);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;state.buttons&nbsp;</span><span style="COLOR: #000000">&amp;=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">~</span><span style="COLOR: #000000">(</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;OIS::MB_Left);&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">turn&nbsp;the&nbsp;bit&nbsp;flag&nbsp;off</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(mButtons[MBT_RIGHT])<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mButtons[MBT_RIGHT]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;state.buttonDown(OIS::MB_Right);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;state.buttons&nbsp;</span><span style="COLOR: #000000">&amp;=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">~</span><span style="COLOR: #000000">(</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;OIS::MB_Right);&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">turn&nbsp;the&nbsp;bit&nbsp;flag&nbsp;off</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(mButtons[MBT_MIDDLE])<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mButtons[MBT_MIDDLE]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;state.buttonDown(OIS::MB_Middle);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;state.buttons&nbsp;</span><span style="COLOR: #000000">&amp;=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">~</span><span style="COLOR: #000000">(</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;OIS::MB_Middle);&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">turn&nbsp;the&nbsp;bit&nbsp;flag&nbsp;off&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: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mButtons[MBT_LEFT]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;state.buttonDown(OIS::MB_Left);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mButtons[MBT_RIGHT]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;state.buttonDown(OIS::MB_Right);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mButtons[MBT_MIDDLE]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;state.buttonDown(OIS::MB_Middle);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>}</span></div>
<br>2.使用SetCursorPos后，无移动鼠标，OIS无法取得鼠标移动信息<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;Win32Mouse::capture()<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">Clear&nbsp;old&nbsp;relative&nbsp;values</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;mState.X.rel&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;mState.Y.rel&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;mState.Z.rel&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;DIDEVICEOBJECTDATA&nbsp;diBuff[MOUSE_DX_BUFFERSIZE];<br>&nbsp;&nbsp;&nbsp;&nbsp;DWORD&nbsp;entries&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;MOUSE_DX_BUFFERSIZE;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;HRESULT&nbsp;hr&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;mMouse</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">GetDeviceData(&nbsp;</span><span style="COLOR: #0000ff">sizeof</span><span style="COLOR: #000000">(DIDEVICEOBJECTDATA),&nbsp;diBuff,&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">entries,&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">&nbsp;);<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(&nbsp;hr&nbsp;</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">&nbsp;DI_OK&nbsp;)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hr&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;mMouse</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">Acquire();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000">(&nbsp;hr&nbsp;</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">&nbsp;DIERR_INPUTLOST&nbsp;)&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hr&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;mMouse</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">Acquire();<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hr&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;mMouse</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">GetDeviceData(&nbsp;</span><span style="COLOR: #0000ff">sizeof</span><span style="COLOR: #000000">(DIDEVICEOBJECTDATA),&nbsp;diBuff,&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">entries,&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">&nbsp;);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">Perhaps&nbsp;the&nbsp;user&nbsp;just&nbsp;tabbed&nbsp;away,&nbsp;and&nbsp;coop&nbsp;settings<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">are&nbsp;nonexclusive..so&nbsp;just&nbsp;ignore</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(&nbsp;FAILED(hr)&nbsp;)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">bool</span><span style="COLOR: #000000">&nbsp;axesMoved&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">false</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">Accumulate&nbsp;all&nbsp;axis&nbsp;movements&nbsp;for&nbsp;one&nbsp;axesMove&nbsp;message..<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">Buttons&nbsp;are&nbsp;fired&nbsp;off&nbsp;as&nbsp;they&nbsp;are&nbsp;found</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">(unsigned&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;i&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;&nbsp;i&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">&nbsp;entries;&nbsp;</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">i&nbsp;)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">switch</span><span style="COLOR: #000000">(&nbsp;diBuff[i].dwOfs&nbsp;)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">case</span><span style="COLOR: #000000">&nbsp;DIMOFS_BUTTON0:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(</span><span style="COLOR: #000000">!</span><span style="COLOR: #000000">_doMouseClick(</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,&nbsp;diBuff[i]))&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">break</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">case</span><span style="COLOR: #000000">&nbsp;DIMOFS_BUTTON1:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(</span><span style="COLOR: #000000">!</span><span style="COLOR: #000000">_doMouseClick(</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,&nbsp;diBuff[i]))&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">break</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">case</span><span style="COLOR: #000000">&nbsp;DIMOFS_BUTTON2:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(</span><span style="COLOR: #000000">!</span><span style="COLOR: #000000">_doMouseClick(</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">,&nbsp;diBuff[i]))&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">break</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">case</span><span style="COLOR: #000000">&nbsp;DIMOFS_BUTTON3:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(</span><span style="COLOR: #000000">!</span><span style="COLOR: #000000">_doMouseClick(</span><span style="COLOR: #000000">3</span><span style="COLOR: #000000">,&nbsp;diBuff[i]))&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">break</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">case</span><span style="COLOR: #000000">&nbsp;DIMOFS_BUTTON4:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(</span><span style="COLOR: #000000">!</span><span style="COLOR: #000000">_doMouseClick(</span><span style="COLOR: #000000">4</span><span style="COLOR: #000000">,&nbsp;diBuff[i]))&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">break</span><span style="COLOR: #000000">;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">case</span><span style="COLOR: #000000">&nbsp;DIMOFS_BUTTON5:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(</span><span style="COLOR: #000000">!</span><span style="COLOR: #000000">_doMouseClick(</span><span style="COLOR: #000000">5</span><span style="COLOR: #000000">,&nbsp;diBuff[i]))&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">break</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">case</span><span style="COLOR: #000000">&nbsp;DIMOFS_BUTTON6:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(</span><span style="COLOR: #000000">!</span><span style="COLOR: #000000">_doMouseClick(</span><span style="COLOR: #000000">6</span><span style="COLOR: #000000">,&nbsp;diBuff[i]))&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">break</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">case</span><span style="COLOR: #000000">&nbsp;DIMOFS_BUTTON7:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(</span><span style="COLOR: #000000">!</span><span style="COLOR: #000000">_doMouseClick(</span><span style="COLOR: #000000">7</span><span style="COLOR: #000000">,&nbsp;diBuff[i]))&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">break</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">case</span><span style="COLOR: #000000">&nbsp;DIMOFS_X:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mState.X.rel&nbsp;</span><span style="COLOR: #000000">+=</span><span style="COLOR: #000000">&nbsp;diBuff[i].dwData;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;axesMoved&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">true</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">break</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">case</span><span style="COLOR: #000000">&nbsp;DIMOFS_Y:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mState.Y.rel&nbsp;</span><span style="COLOR: #000000">+=</span><span style="COLOR: #000000">&nbsp;diBuff[i].dwData;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;axesMoved&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">true</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">break</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">case</span><span style="COLOR: #000000">&nbsp;DIMOFS_Z:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mState.Z.rel&nbsp;</span><span style="COLOR: #000000">+=</span><span style="COLOR: #000000">&nbsp;diBuff[i].dwData;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;axesMoved&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">true</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">break</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">default</span><span style="COLOR: #000000">:&nbsp;</span><span style="COLOR: #0000ff">break</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">end&nbsp;switch</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;}</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">end&nbsp;for</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(&nbsp;axesMoved&nbsp;)<span style="COLOR: #008000">// 有偏移信息才会设置鼠标位置</span><br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(&nbsp;coopSetting&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;DISCL_NONEXCLUSIVE&nbsp;)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">DirectInput&nbsp;provides&nbsp;us&nbsp;with&nbsp;meaningless&nbsp;values,&nbsp;so&nbsp;correct&nbsp;that</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;POINT&nbsp;point;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GetCursorPos(</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">point);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ScreenToClient(mHwnd,&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">point);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mState.X.abs&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;point.x;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mState.Y.abs&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;point.y;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mState.X.abs&nbsp;</span><span style="COLOR: #000000">+=</span><span style="COLOR: #000000">&nbsp;&nbsp;mState.X.rel;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mState.Y.abs&nbsp;</span><span style="COLOR: #000000">+=</span><span style="COLOR: #000000">&nbsp;&nbsp;mState.Y.rel;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mState.Z.abs&nbsp;</span><span style="COLOR: #000000">+=</span><span style="COLOR: #000000">&nbsp;&nbsp;mState.Z.rel;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">Clip&nbsp;values&nbsp;to&nbsp;window</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(&nbsp;mState.X.abs&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">&nbsp;)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mState.X.abs&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(&nbsp;mState.X.abs&nbsp;</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;mState.width&nbsp;)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mState.X.abs&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;mState.width;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(&nbsp;mState.Y.abs&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">&nbsp;)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mState.Y.abs&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(&nbsp;mState.Y.abs&nbsp;</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;mState.height&nbsp;)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mState.Y.abs&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;mState.height;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">Do&nbsp;the&nbsp;move</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(&nbsp;mListener&nbsp;</span><span style="COLOR: #000000">&amp;&amp;</span><span style="COLOR: #000000">&nbsp;mBuffered&nbsp;)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mListener</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">mouseMoved(&nbsp;MouseEvent(&nbsp;</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">,&nbsp;mState&nbsp;)&nbsp;);<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>}</span></div>
<img src ="http://www.cppblog.com/ming81/aggbug/136500.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ming81/" target="_blank">小胖妹</a> 2010-12-15 15:29 <a href="http://www.cppblog.com/ming81/archive/2010/12/15/136500.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>(地基工)人物控制队列想法</title><link>http://www.cppblog.com/ming81/archive/2010/11/22/134287.html</link><dc:creator>小胖妹</dc:creator><author>小胖妹</author><pubDate>Mon, 22 Nov 2010 08:20:00 GMT</pubDate><guid>http://www.cppblog.com/ming81/archive/2010/11/22/134287.html</guid><description><![CDATA[<p dir=ltr align=left>动作切换序列思路模拟：</p>
<p dir=ltr align=left>人物的动作分为上半身，下半身动作</p>
<p dir=ltr align=left>上半身动作：休闲、走路（向前、向后、向左、向右）、跑步（向前、向后、向左、向右）、准备战斗、跳（开始跳，跳循环、结束跳）<br>下半身动作：休闲、走路（向前、向后、向左、向右）、跑步（向前、向后、向左、向右）、准备战斗、跳（开始跳，跳循环、结束跳）</p>
<p dir=ltr align=left>控制逻辑：</p>
<p dir=ltr align=left><img height=686 src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtmlclip1/01/clip_image001.png" width=716><br>*******************************************************悲伤的分割线****************************************************************<br>队列命令问题：<br>1.走路的时候队列创建太频繁，进行解决（使用队列池）<br>2.上面一个队列执行完毕后执行下一个队列。<br>3.队列要能够同时处理两个命令，因为在运动的时候是一个命令，战斗的时候是另外一个命令。<br>4.初步决定使用两个队列，分别控制上半身和下班身动作。</p>
<p dir=ltr align=left>第一种解决方案思路整理（走路+攻击）：<br>1.命令分类，外部根据命令往队列里面插入命令<br>2.命令开始执行，成员变量记住命令的参数，并在渲染的每一帧执行命令。<br>3.执行的每一帧插值，处理命令</p>
<p dir=ltr align=left>举例：<br>1.往命令队列中插入走路命令。&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;&nbsp;&nbsp; 1&nbsp; <br>2.在每一帧中执行走路命令，保存目标位置和源位置，并进行插值。<br>3.往命令队列中插入准备攻击命令&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; 2 有一帧不走动了。解决思路：执行攻击的时候也执行走路插值。？？有可能没有问题，因为速度过快<br>4.开始执行准备攻击命令&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>5.在每一帧中执行准备攻击命令&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;&nbsp;&nbsp; 3&nbsp; <br>6.往命令队列中插入走路命令。&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; <br>7.在每一帧中执行走路命令，保存目标位置和源位置，并进行插值&nbsp;&nbsp;&nbsp;&nbsp; 4&nbsp; </p>
<p dir=ltr align=left>想法：<br>1.上半身和下半身无任何影响（战斗：如果下半身进行休闲动作才改变，否则只改变动作。移动：如果上半身休闲才改变，否则不改变）<br>2.上半身动作影响下半身.（施法：直接修改上下半身动作为施法）<br>3.动作播放结束后处理为</p>
<p dir=ltr align=left>队列影响：<br>第二种情况直接用队列一个一个处理。<br>第一种情况比较难处理（在处理战斗时候，处理换动作命令，然后处理移动命令）<br>//StartAction分为全身和上半身。。。。。</p>
<p dir=ltr align=left>动作分组：<br>休闲动作，不打断动作，进度条动作， 动作播放完毕。</p>
<p dir=ltr align=left>不可行：因为只有一个队列，所以执行走路命令的时候不能处理战斗的命令。 此方法抛弃。</p>
<p dir=ltr align=left>*******************************************************希望的分割线****************************************************************<br>麻烦：<br>解决方案：<br>对外接口：外部参数不管上半身，下半身动作，根据命令类型分配到上半身和下半身队列中去，控制上半身和下半身休闲，战斗。//全身动作或者上半身动作。</p>
<p dir=ltr align=left>1.分为上半身，下半身动作两个命令队列分别处理上半身和下半身动作。</p>
<p dir=ltr align=left>举例：<br>走路+战斗：<br>1.命令队列中插入走路命令<br>2.向上半身，下半身队列中分发各分发一个走路命令。<br>3.会同时处理走路命令。<br>4.命令队列中增加战斗命令。<br>5.判断下半身时候休闲，不是的话分发战斗命令，向上半身队列中分发战斗命令。<br>6.处理上半身，下半身动画播放过程中的处理。</p>
<p dir=ltr align=left>注意：<br>1.上半身的动作和下半身一样的时候。根据下半身的动作帧数控制。<br>2.分发器，根据不同的游戏有不同的分发原则。</p>
<p dir=ltr align=left>*******************************************************希望的分割线****************************************************************<br></p>
<img src ="http://www.cppblog.com/ming81/aggbug/134287.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ming81/" target="_blank">小胖妹</a> 2010-11-22 16:20 <a href="http://www.cppblog.com/ming81/archive/2010/11/22/134287.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>(地基工) DirectX常用 选项</title><link>http://www.cppblog.com/ming81/archive/2010/11/12/133441.html</link><dc:creator>小胖妹</dc:creator><author>小胖妹</author><pubDate>Fri, 12 Nov 2010 09:26:00 GMT</pubDate><guid>http://www.cppblog.com/ming81/archive/2010/11/12/133441.html</guid><description><![CDATA[<p>内存池</p>
<p>表面和其它一些Direct3D资源被放在多种内存池中。内存池的种类由D3DPOOL枚举类型的一个成员来指定。可用到的内存池有下列几种：</p>
<p>D3DPOOL_DEFAULT——表示Direct3D将根据资源的类型和用途把它们放在最合适的地方。这有可能是显存、AGP内存或者系统内存中。值得注意的是，这种内存池中的资源必须要在IDirect3DDevice9::Reset被调用之前消毁掉，并且再次使用时必须重新初始化。</p>
<p>理解： 系统自动分配内存，栈内存一样，系统自动分配内存位置。</p>
<p>D3DPOOL_MANAGED——资源将由Direct3D管理并且按设备的需要来指定放在显存还是放在AGP内存中。当应用程序访问和改变资源时它先把这些资源拷贝到系统内存中，当需要时Direct3D会自动把它们拷贝到显存里。</p>
<p>理解：直接放在显存中，当改变资源时，拷贝会内存，修改完再回显存，不需改变的资源比较适合。</p>
<p>D3DPOOL_SYSTEMMEM——指定资源放在系统内存中。</p>
<p>D3DPOOL_SCRATCH——指定资源放在系统内存中，它与D3DPOOL_SYSTEMMEM不同之处在于使用这些资源不必受图形设备的限制。因此，参数使图形设备不能访问该内存池的资源，但资源可以相互拷贝。</p>
<p><br>理解：放在内存中，当图形设备不能访问，经常访问和修改的资源。</p>
<p><br>内存锁定方式</p>
<p>D3DLOCK_DISCARD——这个参数仅仅会在动态缓存时被使用。它指示硬件丢弃缓存并返回一个指向新分配的缓存的指针。这是很有用，因为当我们存取一个新分配的缓存时它允许硬件继续从丢弃的缓存渲染。这防止了硬件延迟。</p>
<p>动态缓存的时候使用，原有的会被丢弃。</p>
<p>D3DLOCK_NOOVERWRITE——这个参数仅仅会在动态缓存时被使用。它声明你将向缓存中添加数据。即你不能向已经渲染的内存中写数据。这是有好处的因为他允许你在添加新数据到缓存的同时让硬件继续渲染。</p>
<p>只向缓存中增加数据</p>
<p>D3DLOCK_READONLY——这个参数声明你锁定的缓存只能从中读取数据而不能写数据。这允许一些内在的优化。</p>
<p>用参数D3DLOCK_DISCARD和D3DLOCK_NOOVERWRITE表明缓存的一部分被锁定之后能继续被使用。假如硬件配置允许这些标记被使用，则在对缓存进行锁定时，其他的显示操作就不会中断。</p>
<p><br>交换缓冲类型</p>
<p>D3DSWAPEFFECT_DISCARD：&nbsp;&nbsp;&nbsp; 后台的缓冲区复制到屏幕上，丢弃后备缓冲区<br>D3DSWAPEFFECT_FLIP：&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 后台缓冲区和前台缓冲区调换<br>D3DSWAPEFFECT_COPY：&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 后台缓冲区复制到前台缓冲区&nbsp;&nbsp;&nbsp;&nbsp; </p>
<p><br>缓存创建标志</p>
<p>3DUSAGE_DYNAMIC——设置这个参数可以使缓存是动态的。<br>D3DUSAGE_POINTS——这个参数指定缓存存储原始点。这个参数仅仅用在顶点缓冲中。<br>D3DUSAGE_SOFTWAREPROCESSING——使用软件顶点处理<br>D3DUSAGE_WRITEONLY——指定应用程序只能写缓存。它允许驱动程序分配最适合的内存地址作为写缓存。注意如果从创建好的这种缓存中读数据，将会返回错误信息。</p>
<p><br>&nbsp;</p>
<img src ="http://www.cppblog.com/ming81/aggbug/133441.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ming81/" target="_blank">小胖妹</a> 2010-11-12 17:26 <a href="http://www.cppblog.com/ming81/archive/2010/11/12/133441.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>(搬运工)Render to Texture（渲染到纹理） </title><link>http://www.cppblog.com/ming81/archive/2010/11/12/133429.html</link><dc:creator>小胖妹</dc:creator><author>小胖妹</author><pubDate>Fri, 12 Nov 2010 07:24:00 GMT</pubDate><guid>http://www.cppblog.com/ming81/archive/2010/11/12/133429.html</guid><description><![CDATA[　渲染到纹理是D3D中的一项高级技术。一方面，它很简单，另一方面它很强大并能产生很多特殊效果。 比如说发光效果，环境映射，阴影映射，都可以通过它来实现。渲染到纹理只是渲染到表面的一个延伸。我们只需再加些东西就可以了。首先，我们要创造一个纹理，并且做好一些防范措施。第二步我们就可以把适当的场景渲染到我们创建的纹理上了。然后，我们把这个纹理用在最后的渲染上。<br><br>&#183;main.cpp<br>　　首先我们得声明所需要的对象。当然我们需要一张用来渲染的纹理。此外，我们还需要两个Surface对象。一个是用来存储后台缓冲区，一个用来当纹理的渲染对象。后面我再详细介绍它们。另外我们还需要两个矩阵，一个是用来当纹理的投影矩阵，另一个是存储原来的矩阵。<br><br>LPDIRECT3DTEXTURE9 pRenderTexture = NULL;<br>LPDIRECT3DSURFACE9 pRenderSurface = NULL,pBackBuffer = NULL;<br>D3DXMATRIX matProjection,matOldProjection;<br><br>　　现在我们来创建纹理。前两个参数是纹理的宽度和高度，第三个参数是纹理的多级渐进纹理序列参数，在这里是设为1，第四个参数非常重要而且必须设为D3DUSAGE_RENDERTARGET，表明我们所创建的纹理是用来渲染的。剩下的参数就是指纹理格式，顶点缓冲区的内存位置，和一个指向纹理的指针。当纹理是用来当渲染对象时，顶点缓冲区的内存位置必须设为D3D_DEFAILT。 <br><br>g_App.GetDevice()-&gt;CreateTexture(256,256,1,D3DUSAGE_RENDERTARGET,D3DFMT_R5G6B5,D3DPOOL_DEFAULT,&amp;pRenderTexture,NULL);<br><br>　　为了访问纹理内存对象，我们需要一个Surface对象，因为D3D中的纹理是用这样的一个Surface来存储纹理数据的。为了得到纹理表面的Surface,我们需要调用方法GetSurfaceLevel() 。第一个参数我们设为0，第二个参数为一个指向surface对象的指针。<br><br>pRenderTexture-&gt;GetSurfaceLevel(0,&amp;pRenderSurface);<br><br>下一步就是创建一个适合纹理维数的投影矩阵，因为纹理的横纵比和后台缓冲区的不一样。<br><br>D3DXMatrixPerspectiveFovLH(&amp;matProjection,D3DX_PI / 4.0f,1,1,100);<br><br>在我们的循环渲染之前，我们必须保存后台缓冲区和它的投影矩阵。<br><br>g_App.GetDevice()-&gt;GetTransform(D3DTS_PROJECTION,&amp;matOldProjection);<br>g_App.GetDevice()-&gt;GetRenderTarget(0,&amp;pBackBuffer); <br><br>　　渲染循环函数可以分为两个部分。第一部分是渲染到纹理的过程。因此，渲染对象必须设为纹理表面。然后我们就可以把东西渲染到这个对象上了。渲染到另一个表面上和正常地渲染到后台缓冲区差不多。只有一点不同，那就是先不调用Prensent（）函数，因为纹理上的内容并不需要显示在屏幕上。象平时一样，我们先要重置表面颜色缓冲区，并且调用BeginSence()和EndSence()方法。为了能够适当的渲染，我们必须设置和纹理表面相符的投影矩阵。否则最后的图象可能被扭曲<br><br>//render-to-texture<br>g_App.GetDevice()-&gt;SetRenderTarget(0,pRenderSurface); //set new render target<br>g_App.GetDevice()-&gt;Clear(0,NULL,D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER,D3DCOLOR_XRGB(100,100,100),1.0f,0); //clear texture<br>g_App.GetDevice()-&gt;BeginScene();<br><br>g_App.GetDevice()-&gt;SetTexture(0,pPyramideTexture);<br><br>D3DXMatrixRotationY(&amp;matRotationY,fRotation);<br>D3DXMatrixTranslation(&amp;matTranslation,0.0f,0.0f,5.0f);<br>g_App.GetDevice()-&gt;SetTransform(D3DTS_WORLD,&amp;(matRotationY * matTranslation));<br>g_App.GetDevice()-&gt;SetTransform(D3DTS_PROJECTION,&amp;matProjection); //set projection matrix<br><br>g_App.GetDevice()-&gt;SetStreamSource(0,pTriangleVB,0,sizeof(D3DVERTEX));<br>g_App.GetDevice()-&gt;DrawPrimitive(D3DPT_TRIANGLELIST,0,4);<br><br>g_App.GetDevice()-&gt;EndScene();<br><br>　　渲染循环的第二部分就是渲染最后场景的过程（也就是显示到屏幕上的过程）。渲染对象重新设为后台缓冲区，投影矩阵重新设为原来的投影矩阵。由于纹理已经准备好了，所以它和纹理层0相关联。<br><br>//render scene with texture<br>g_App.GetDevice()-&gt;SetRenderTarget(0,pBackBuffer); //set back buffer<br>g_App.GetDevice()-&gt;Clear(0,NULL,D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER,D3DCOLOR_XRGB(0,0,0),1.0f,0);<br>g_App.GetDevice()-&gt;BeginScene();<br><br>g_App.GetDevice()-&gt;SetTexture(0,pRenderTexture); //set rendered texture<br><br>g_App.GetDevice()-&gt;SetTransform(D3DTS_WORLD,&amp;matTranslation);<br>g_App.GetDevice()-&gt;SetTransform(D3DTS_PROJECTION,&amp;matOldProjection); //restore projection matrix<br><br>g_App.GetDevice()-&gt;SetStreamSource(0,pQuadVB,0,sizeof(D3DVERTEX));<br>g_App.GetDevice()-&gt;DrawPrimitive(D3DPT_TRIANGLESTRIP,0,2);<br><br>g_App.GetDevice()-&gt;EndScene();<br>g_App.GetDevice()-&gt;Present(NULL,NULL,NULL,NULL);<br><br>最后我们通过调用Release()方法释放Surface对象。<br><br>pRenderSurface-&gt;Release();<br>pRenderSurface = NULL;<br><br>pBackBuffer-&gt;Release();<br>pBackBuffer = NULL;<br>
<img src ="http://www.cppblog.com/ming81/aggbug/133429.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ming81/" target="_blank">小胖妹</a> 2010-11-12 15:24 <a href="http://www.cppblog.com/ming81/archive/2010/11/12/133429.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>(搬运工)AnimationBlender - Ogre实现不同动画之间的混合</title><link>http://www.cppblog.com/ming81/archive/2010/11/08/133018.html</link><dc:creator>小胖妹</dc:creator><author>小胖妹</author><pubDate>Mon, 08 Nov 2010 11:01:00 GMT</pubDate><guid>http://www.cppblog.com/ming81/archive/2010/11/08/133018.html</guid><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 英文原文: http://test.ogitor.org/tiki/AnimationBlender动画混合 -- 实现两个动画的切换, 一个动画逐渐消逝, 另一个动画逐渐显示来实现. 主要通过动画状态的权重来实现通过三种方式来实现两个动画的混合:&nbsp;&nbsp;&nbsp; - BlendSwitch - 直接切换至目标动画&nbsp;&nbsp;&nbsp; - BlendWhil...&nbsp;&nbsp;<a href='http://www.cppblog.com/ming81/archive/2010/11/08/133018.html'>阅读全文</a><img src ="http://www.cppblog.com/ming81/aggbug/133018.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ming81/" target="_blank">小胖妹</a> 2010-11-08 19:01 <a href="http://www.cppblog.com/ming81/archive/2010/11/08/133018.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>(搬运工)把D3D画面渲染到桌面！不用创建任何窗口 </title><link>http://www.cppblog.com/ming81/archive/2010/11/05/132534.html</link><dc:creator>小胖妹</dc:creator><author>小胖妹</author><pubDate>Fri, 05 Nov 2010 03:27:00 GMT</pubDate><guid>http://www.cppblog.com/ming81/archive/2010/11/05/132534.html</guid><description><![CDATA[<span style="FONT-SIZE: 10pt">其实这个很简单，只是创建设备的时候那个hwnd有点不一样！<br>可能有人就会说，用GetDesktopWindows()获得桌面的句柄不就行了？那就错了！这样会没有效果的！正确的代码如下：<br></span><br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp; HWND&nbsp;hWnd&nbsp;&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;&nbsp;FindWindowEx(GetDesktopWindow()&nbsp;,&nbsp;&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">&nbsp;&nbsp;,&nbsp;&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;Progman&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;&nbsp;,&nbsp;&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;Program&nbsp;Manager&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;);<br>&nbsp;&nbsp;&nbsp;&nbsp;hWnd&nbsp;&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;&nbsp;FindWindowEx(hWnd&nbsp;,&nbsp;&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">&nbsp;&nbsp;,&nbsp;&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;SHELLDLL_DefView&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;&nbsp;,&nbsp;&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">&nbsp;);<br>&nbsp;&nbsp;&nbsp;&nbsp;hWnd&nbsp;&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;&nbsp;FindWindowEx(hWnd&nbsp;,&nbsp;&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">&nbsp;&nbsp;,&nbsp;&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;SysListView32&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;&nbsp;,&nbsp;&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;FolderView&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;&nbsp;初始化&nbsp;D3D&nbsp;设备&nbsp;</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;InitD3D(hWnd);</span></div>
<br><span style="FONT-SIZE: 10pt">是不是很简单！哈哈。<br><br>显示的时候，如果想渲染在桌面的一角，则可以这样写：<br></span><br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;显示在左上角，128&#215;128宽</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><font color=#000000>&nbsp;RECT&nbsp;rect;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;rect.left&nbsp;<span style="COLOR: #000000">=</span></font><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;rect.right&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">128</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;rect.top&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;rect.bottom&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">128</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;显示</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;</span><span style="COLOR: #000000">&nbsp;g_pd3dDevice</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">Present(</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">&nbsp;,&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">rect&nbsp;,&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">&nbsp;,&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">);</span></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span></div>
<img src ="http://www.cppblog.com/ming81/aggbug/132534.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ming81/" target="_blank">小胖妹</a> 2010-11-05 11:27 <a href="http://www.cppblog.com/ming81/archive/2010/11/05/132534.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>