??xml version="1.0" encoding="utf-8" standalone="yes"?> 谈到SkinWeights里面的TransformMatrix的时候一W带q,我始l不理解q个matrix有何用处Q因为我感觉所有的点变换都被 Frame里面的阶层体pd?那么SkinWeights里面的matrix有什么用?/p>
l过我一个晚上的思考,看了GameDev论坛的帖子,l于理解了?/p>
首先讲徏模,建模建出来的是一些顶点,q些点l成了最原始的mesh?/p>
最原始的mesh中有SkinWeights信息 SkinWeights { 名字Q?/p>
影响的顶Ҏ(gu)Q?/p>
点的烦引;//是影响了几个顶?/p>
点权重Q?/乘以Frame TransformMatrix的百分比 最后就是一?*4的矩阵; } q个4*4矩阵是这旉骼在 Mesh中的位置的逆矩阵,也就是相对于 local坐标pR?/p>
我说的明白点Q手腕是个骨|手指是手腕影响的顶炏V就是一个点,vetexQ在自n坐标pM?/p>
那么?手指这个点 * SkinWeightsMatrix 得到的就是个位置Q什么位|?q当于把手腕连带指移到坐标原炏V当Ӟ手腕在坐标原点的位置?/p>
至于Frame中存储的阶层体系矩阵是现在骨骼的位|?/p>
扑ֈ现在手腕骨骼的矩? 手指Vertex* SkinWeighsMatrix*(肩膀的Matrix*背肘的matrix*手腕的matrix)Q?/p>
那么手指自然就变换C相应的位|?/p>
我说得这么通俗Q不知道传达到思想没? 参考链?/p>
http://www.gamedev.net/community/forums/topic.asp?topic_id=479158 http://www.gamedev.net/community/forums/topic.asp?topic_id=392242
最后感慨下QGameDev的论坛果然是好地?/p>
q样明显是不好的Q前几天我开始构q点d3d库,构徏了些许类之后发现把它们都攑֜当前目录Q也是工程目录下市不好的,应该把它们分cM下?/p>
于是我试了下Q新Z个文件夹Q然后把。h丢进厅R?/p>
l果发现在cpp文g?#include “*****.h”不能~译通过。后来觉得VS里一定有讄L.h,路径的设|?/p>
于是?/p>
在property内看C相应讄Q如?/p>
看到 Additional那个选项没,在那里添加设|\径的地方Q将.h.cpp所在的文g夹包含进d行了?/p>
如图 几个头文gQ我一看,我靠Q这不是把简单的问题搞复杂了吗,随手删掉那个c文g?/p>
l果不能~译了,我靠Q?/p>
fatal error C1083: Cannot open precompiled header file: \'Debug/v13_3.pch\': No such file or directory 怎么rebuild all都不行?/p>
上网查了一下,才搞懂了Q?/p>
Q-Q-Q-Q-Q-Q-Q-Q-ȝQ-Q-Q- 如果工程很大Q头文g很多Q而有几个头文件又是经常要用的Q那?/p>
1。把q些头文件全部写C个头文g里面去,比如写到preh.h 2。写一个preh.cQ里面只一句话Q?include "preh.h" 3。对于preh.cQ在project setting里面讄creat precompiled headersQ对于其?/p>
.c文gQ设|use precompiled header file // 哈哈 我试了一下,效果很明显,不用precompiled headerQ编译一ơ我可以M个厕所Q用 precompiled headerQ编译的时候,我可以站h怸懒腰Q活动活动就差不多啦 Q-Q-Q-Q-Q{载的文章Q-Q-Q-Q-Q- 预编译头的概念:(x) 所谓的预编译头是把一个工E中的那一部分代码,预先~译好放在一个文仉(通常?/p>
?pch为扩展名?Q这个文件就UCؓ(f)预编译头文gq些预先~译好的代码可以是Q何的 C/C++代码--------甚至是inline的函敎ͼ但是必须是稳定的Q在工程开发的q程中不?/p>
被经常改变。如果这些代码被修改Q则需要重新编译生成预~译头文件。注意生成预~?/p>
译头文g是很耗时间的。同时你得注意预~译头文仉常很大Q通常?-7M大。注意及(qing) 时清理那些没有用的预~译头文件?/p>
也许你会(x)问:(x)现在的编译器都有Time stamp的功能,~译器在~译整个工程的时候,?/p>
只会(x)~译那些l过修改的文Ӟ而不?x)去~译那些从上ơ编译过Q到现在没有被修改过 的文件。那么ؓ(f)什么还要预~译头文件呢Q答案在q里Q我们知道编译器是以文g为单 位编译的Q一个文件经q修改后Q会(x)重新~译整个文gQ当然在q个文g里包含的所?/p>
头文件中的东西(.eg Macro, Preprocesser Q都要重新处理一遍。VC的预~译头文?/p>
保存的正是这部分信息。以避免每次都要重新处理q些头文件?/p>
预编译头的作用:(x) Ҏ(gu)上文介绍Q预~译头文件的作用当然是提高便宜速度了,有了它你没有必要每次 都编译那些不需要经常改变的代码。编译性能当然提高了?/p>
预编译头的用:(x) 要用预~译_(d)我们必须指定一个头文gQ这个头文g包含我们不会(x)l常改变?/p>
代码和其他的头文Ӟ然后我们用这个头文g来生成一个预~译头文Ӟ.pch文gQ?/p>
惛_大家都知?StdAfx.hq个文g。很多h都认是VC提供的一?#8220;pȝU别”?/p>
Q编译器带的一个头文g。其实不是的Q这个文件可以是M名字的。我们来考察一?/p>
典型的由AppWizard生成的MFC Dialog Based E序的预~译头文件。(因ؓ(f)AppWizard ?x)?f)我们指定好如何用预~译头文Ӟ默认的是StdAfx.hQ这是VCL(fng)名字Q。我?/p>
?x)发现这个头文g里包含了以下的头文gQ?/p>
#include <afxwin.h> // MFC core and standard components #include <afxext.h> // MFC extensions #include <afxdisp.h> // MFC Automation classes #include <afxdtctl.h> // MFC support for Internet Explorer 4 Common Controls #include <afxcmn.h> q些正是使用MFC的必d含的头文Ӟ当然我们不太可能在我们的工程中修改这些头?/p>
件的Q所以说他们是稳定的?/p>
那么我们如何指定它来生成预编译头文g。我们知道一个头文g是不能编译的。所以我 们还需要一个cpp文g来生?pch 文g。这个文仉认的是StdAfx.cpp。在q个文g 里只有一句代码就是:(x)#include “Stdafx.h”。原因是理所当然的,我们仅仅是要它能 够编译而已?D?D?D也就是说Q要的只是它?cpp的扩展名。我们可以用/Yc~译开x?/p>
定StdAfx.cpp来生成一?pch文gQ通过/Fp~译开x指定生成的pch文g的名字。打 开project ->Setting->C/C++ 对话框。把Category指向Precompiled Header。在左边?/p>
?wi)Ş视图里选择整个工程 Project Options(右下角的那个白的地方)可以看到 /Fp “debug/PCH.pch”Q这是?/p>
定生成的.pch文g的名字,默认的通常是 <工程?gt;.pchQ我的示例工E名是PCHQ?/p>
然后Q在左边的树(wi)形视N选择StdAfx.cpp.//q时只能选一个cpp文gQ?/p>
q时原来的Project Option变成?Source File OptionQ原来是工程Q现在是一个文?/p>
Q当然变了)。在q里我们可以看到 /Yc开养I/Yc的作用就是指定这个文件来创徏一?/p>
Pch文g?Yc后面的文件名是那个包含了E_代码的头文gQ一个工E里只能有一个文 件的可以有YC开兟뀂VC根据这个选项?StdAfx.cpp~译成一个Obj文g和一个PCH文g ?/p>
然后我们再选择一个其它的文g来看看,//其他cpp文g 在这里,Precomplier 选择?Use ⋯⋯⋯一,头文件是我们指定创徏PCH 文g的stda fx.h 文g。事实上Q这里是使用工程里的讄Q(如图1Q?Yu”stdafx.h”?/p>
q样Q我们就讄好了预编译头文g。也是_(d)我们可以使用预编译头功能了。以 下是注意事项Q?/p>
1):如果使用?YuQ就是说使用了预~译Q我们在每个.cpp文g的最开_(d)我强调一?/p>
是最开_(d)包含 你指定生pch文g?h文gQ默认是stdafx.hQ不然就?x)有问题。如 果你没有包含q个文gQ就告诉你Unexpected file end. 如果你不是在最开头包含的Q?/p>
你自p以下q道了Q绝Ҏ(gu)很惊人的效果?. fatal error C1010: unexpected end of file while looking for precompiled header directive Generating Code... 2Q如果你把pch文g不小心丢了,~译的时候就?x)生很多的不正常的行?f)。根据以?/p>
的分析,你只要让~译器生成一个pch文g。也是说把 stdafx.cppQ即指定/Yc的那?/p>
cpp文gQ从新编译一遍。当然你可以d?Rebuild All。简单一点就是选择那个cpp 文gQ按一下Ctrl + F7可以了。不然可是很费旉的哦?/p>
// 呵呵Q如果你居然耐着性子看到了这里,那么再回到帖子最开始看看我的ȝ吧! _right.y = 0; D3DXVec3Cross(&_up, &_look, &_right); 再次感叹一下Animation 那本书实在是太好了?/p>
途中的茶壶会(x)按照自己在外部文件中定义的\径走Q有直线Q有曲线?/p>
外部txt是这样定义的 xof 0303txt 0032 template Path { template Route { Route Robot { 0; // Straight path type 1; // Curved path type 1; // Curved path type 0; // Straight path type 0; // Straight path type 然后用个c解析,Ҏ(gu)旉插值就行了?br>
阅读 Advanced Animation
后来遇到了个预编译头的问题,见上文章吧?
]]>
]]>
ơ计方?br> right向量的y分量始终?
*/
//=========================================
在Cameracd了一个,以自w位|和目标位置计算look,up,right向量的函?br>void zybCamera::setPositionAndTarget(D3DXVECTOR3* pos,D3DXVECTOR3* target)
{
_pos = *pos;
D3DXVECTOR3 look = *target - *pos;
D3DXVec3Normalize(&look,&look);
_look = look;
//正向旋{90°Q想惌己前Ҏ(gu)前向量,又向量自然ؓ(f)前向量旋?0
_right.x = look.z;
_right.z = -look.x;
D3DXVec3Normalize(&_right,&_right);
D3DXVec3Normalize(&_up, &_up);
}
]]>
׃一个早上的旉Q终于将路径库扩充完毕?/p>
<F8569BED-53B6-4923-AF0B-59A09271D556>
DWORD Type; // 0=straight, 1=curved
Vector Start;
Vector Point1;
Vector Point2;
Vector End;
}
<18AA1C92-16AB-47a3-B002-6178F9D2D12F>
DWORD NumPaths;
array Path Paths[NumPaths];
}
5; // 5 paths
0.0, 10.0, 0.0; // Start
0.0, 10.0, 0.0; // Unused
0.0, 10.0, 0.0; // Unused
0.0, 10.0, 150.0;, // End
0.0, 10.0, 150.0; // Start
75.0, 10.0, 150.0; // Point1
150.0, 10.0, 75.0; // Point2
150.0, 10.0, 0.0;, // End
150.0, 10.0, 0.0; // Start
150.0, 10.0, -75.0; // Point1
75.0, 10.0, -150.0; // Point2
0.0, 10.0, -150.0;, // End
0.0, 10.0, -150.0; // Start
0.0, 10.0, 0.0; // Unused
0.0, 10.0, 0.0; // Unused
-150.0, 10.0, 75.0;, // End
-150.0, 10.0, 75.0; // Start
0.0, 10.0, 0.0; // Unused
0.0, 10.0, 0.0; // Unused
0.0, 10.0, 0.0;; // End
}
]]>
利用上篇文章的D3DXMESHCONTAINER_EXQLoadMesh和DrawMesh都是单的基础cd敎ͼ
以后׃用每ơ蝲入的时候都写那一大堆q_的代码?br>
开始了Advanced Animation with DirectX的阅?br>基础cd的构建是重要?q后打算把它们加入我的zybToos的Framework里?br>代码来自书中
q几天快要看完那本书了,q剩动态阴影和2D。明天应该就可以完结了?/p>
~程之美看了l论前面引言Q我发现2q来我忽视了一个重要的东西是法。幸好我在大三这一q刚开始发C?/p>
DirectX中基q有Animation不太懂,不过我已l打CAdvanced Animation with DirectX9?/p>
听着MP3中《音乐天堂》精选,学习(fn)完后走在大学的\上?/p>
感觉ȝ是如此的q?...
operator void*() 意义Qstream是否出错Q相当于!fail()Q?br>operator !() 意义Qstream是否已出错(相当于fail()Q?/p>
我们可以q用operator void*()在控制结构中z测出stream的当前状?
while (std::cin)
{
}
控制l构中的布尔条g值ƈ不是非得直接转换为bool不可Q只要能够{换ؓ(f)某个整数型别或指针型别就够了?br>转换为void* 常常是ؓ(f)了在同一表达式中d对象q测试是否成功:(x)
if(std::cin>> x)
{
//reading x was successful
}
正如先前的讨论,表达?br>std::cin >> x
?x)返回cinQ所以读入x后,上述语句变ؓ(f)
if(std::cin)
{
}
此时的cin被用于条件判?所以cin?x)调?operator void*,q回"stream是否发生错误"
以上技术的几个典型应用是以@环读入对象ƈ处理
while(std::cin >> obj)
{
std:: cout << obj << std::endl;
}
如果failbit或badbit被设立,该@环就立即中止---出现错误或者读?end-of-file).
我们可以利用operator!q行相反试Q它?x)返?strean是否已发生错?Q也是说如果failbit 或badbit被设立就?x)返回true用法如下:
if(!std::cin)
{
//the stream is not OK
}
上述文字Z <<c++标准E序?自修教程与参考手?>>p600 侯捷-孟岩?/p>
׃几天旉l于这本书阅读完了Q里面的streambuf没有理解Q是我功底不够的~故?..
开学了Qh多了hQl静静的学习(fn)