﻿<?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>博客园-Canbitwell Products</title><link>http://www.cnblogs.com/Yuri/</link><description>Yuri'Blog
  +[基于冲量物理实时模拟]　[碰撞检测]</description><language>zh-cn</language><lastBuildDate>Wed, 03 Dec 2008 05:44:10 GMT</lastBuildDate><pubDate>Wed, 03 Dec 2008 05:44:10 GMT</pubDate><ttl>60</ttl><item><title>NOIp</title><link>http://www.cnblogs.com/Yuri/archive/2007/11/30/963513.html</link><dc:creator>Yuri</dc:creator><author>Yuri</author><pubDate>Fri, 30 Nov 2007 05:13:00 GMT</pubDate><guid>http://www.cnblogs.com/Yuri/archive/2007/11/30/963513.html</guid><wfw:comment>http://www.cnblogs.com/Yuri/comments/963513.html</wfw:comment><comments>http://www.cnblogs.com/Yuri/archive/2007/11/30/963513.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cnblogs.com/Yuri/comments/commentRss/963513.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/Yuri/services/trackbacks/963513.html</trackback:ping><description><![CDATA[[NOIp复赛那天看了分]<br />
第一题和第二题AC。<br />
第一题排序用的qsort。freepascal和delphi都自带块排，抄一个，再改一下，哈哈&#8230;&#8230;RP--<br />
第二题没看完全题竟然过了&#8230;&#8230;（猜对题意了，RP--）<br />
<br />
第三题：<br />
DP没想出来，写了个搜索，不过我在最后5分钟时加了个剪枝上去&#8230;&#8230;坏了，把最优解剪了（虽然3个样例过了）&#8230;&#8230;<img height="20" alt="" src="http://www.cnblogs.com/images/cnblogs_com/yuri/27.gif" width="20" border="0" /> <br />
RP值已经在做第一题和第二题时用掉了，因此最后就对了那个1x1的那组数据。而且后来一看那题的数据，要小非常小，要大也比较大（Stack overflow），硬搜的话应该能过3~4个点，剪枝也没啥意义。<br />
<br />
第四题没时间看懂，所以只好没水平的输样例，骗了10分。不过有牛人能骗30分以上，前提是看懂题。<br />
<br />
我们省上200的10人左右（最高两个280，都已经获过奖），不像湖南那么牛1等分数线就290&#8230;&#8230;<br />
<br />
————————————————————————————————————<br />
[11月底]<br />
全国分数线140？我听说我们省14+4个一等（其中4个已经得过一等），和我老师估计的基本一样。<br />
<br />
。。。。<br />
这几天正抓紧准备资料中&#8230;&#8230;不过我发现保送生的 个人陈述不是怎么好写&#8230;&#8230; <br />
<br />
————————————————————————————————————<br />
[12月初]<br />
<font face="Courier New">山西<br />
序号 姓名 年级 就读学校 总分 指导教师<br />
1 苏煜* 高三 山大附中 280 侯晓静<br />
2 强瑞鑫 高二 山西省实验中学 280 马宏春<br />
3 董力 高三 康杰中学 260 赵辉<br />
4 靳一凡* 高三 山西省实验中学 250 马宏春<br />
5 张昆玮 高二 山西省实验中学 230 马宏春<br />
6 游雅 高二 太原十八中 220 金辉<br />
7 忻韬 高三 太原五中 220 褚鹏<br />
8 陈怡同 高一 山大附中 210 侯晓静<br />
9 呼延杉 高三 太原五中 210 王莉<br />
10 赵克伟 高三 成成中学 200 宋志龙<br />
11 李子真 高二 山西省实验中学 200 马宏春<br />
12 冀崇恩 高二 山大附中 190 侯晓静<br />
13 曹玮 高二 太原十八中 190 刘世峰<br />
14 贺洋 高二 太原十二中 190 王莉<br />
15 谢良 高三 康杰中学 190 付莹<br />
16 王江涛* 高二 山大附中 180 侯晓静<br />
17 赵眺* 高二 山大附中 180 侯晓静<br />
18 王鑫驰 高三 康杰中学 180 付莹</font><br />
呵呵，上榜了 
 <img src ="http://www.cnblogs.com/Yuri/aggbug/963513.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/43772/" target="_blank">[新闻]Digg创始人：不再考虑出售公司 将适机并购</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>研究Xenocode</title><link>http://www.cnblogs.com/Yuri/archive/2007/11/16/817793.html</link><dc:creator>Yuri</dc:creator><author>Yuri</author><pubDate>Fri, 16 Nov 2007 05:19:00 GMT</pubDate><guid>http://www.cnblogs.com/Yuri/archive/2007/11/16/817793.html</guid><wfw:comment>http://www.cnblogs.com/Yuri/comments/817793.html</wfw:comment><comments>http://www.cnblogs.com/Yuri/archive/2007/11/16/817793.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnblogs.com/Yuri/comments/commentRss/817793.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/Yuri/services/trackbacks/817793.html</trackback:ping><description><![CDATA[<p align="right">暑假没事写的，当时一直没发布&#8230;&#8230;<br />
</p>
<p align="left"><br />
　　最近弄下来Xenocode Postbuild 2007的破解版，加密.Net程序集挺好，而且它能把程序编译成x86的，选Suppress ILDASM and other external reflection tools或者Compile managed application to native x86 executable image就行，后者可以让程序脱离.Net Framework。只是，自己程序一旦转为本机代码下的，它运行前就会弹出个消息框说：&#8220;This application was created using an evalution version of Xenocode products.&#8221; 用其他的功能比如扰乱就没这个问题，但还是觉的编译成x86更安全些。可是这个消息框太讨厌&#8230;&#8230;<br />
<br />
<br />
　　用IDA pro打开postbuild的主程序会发现他的程序里有一个段无法反汇编，我估计这个段是加密了的代码。我估计这些加密的代码就是自己写的程序集的代码。用Postbuild处理自己的.net程序也会产生这样一个段，结构和postbuild的主程序相似。<br />
<img alt="" src="http://www.cnblogs.com/images/cnblogs_com/Yuri/101233/o_postbuildst.PNG" border="0" /><br />
在这个段后面有另一个段，不管是自己的exe还是postbuild的主程序IDA都能反汇编出一部分代码，而且它们基本相同。这些代码我估计是在加载exe时执行的，它用来解密并启动加密了的原始.Net程序。<br />
所以我想Postbuild应该原先也是.Net的，然后Xenocode Postbuild发布时，自己将自己处理了一遍，就成了现在这个样子。<br />
<br />
弹出消息框很可能会直接调用MessageBox这个API函数 ，可以在最后找到：<br />
<img height="54" alt="" src="http://www.cnblogs.com/images/cnblogs_com/yuri/101233/o_postbuildst2.PNG" width="821" border="0" /><br />
然后那个消息框的调用就非常好找：<br />
<img height="128" alt="" src="http://www.cnblogs.com/images/cnblogs_com/yuri/101233/o_postbuildst3.PNG" width="845" border="0" /><br />
我本以为，这些代码会被复制到postbuild处理出的每一个编译成x86的程序中，所以，我就用UE把这几条指令对应的字节全改成0x90，即nop，<br />
结果不起作用。。。<br />
显然，这就证明了刚才：<br />
　这些代码是postbuild将自己编译成x86而产生的，postbuild自己将自己处理过<br />
　&#8220;这些代码我估计是在加载exe时执行的，它用来解密并启动加密了的原始.Net程序。&#8221;<br />
所以postbuild处理程序时，以上这些代码是由那个被加密了的段中的程序产生的，这就不好说了。。。。<br />
<br />
　　不过，用postbuild处理过的程序，倒是可以用这种方法除去那个消息框。<br />
修改有两种方法，要么都换成nop指令，要么把调用堆栈里的hWnd参数换成任意值，只要不是0，也不和别的程序的窗体的Handle相同即可（后者不是很好，但通常不会碰巧对应上一的窗体的Handle，一般Handle的值都较大，设成1应该差不多，这个只需改一个字节，实在不行把那条消息内容改了） </p>
<img src ="http://www.cnblogs.com/Yuri/aggbug/817793.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/43771/" target="_blank">[新闻]福布斯:中国经济增长减速 网游行业从中获益</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>碰撞检测 小结</title><link>http://www.cnblogs.com/Yuri/archive/2007/07/28/834227.html</link><dc:creator>Yuri</dc:creator><author>Yuri</author><pubDate>Sat, 28 Jul 2007 15:00:00 GMT</pubDate><guid>http://www.cnblogs.com/Yuri/archive/2007/07/28/834227.html</guid><wfw:comment>http://www.cnblogs.com/Yuri/comments/834227.html</wfw:comment><comments>http://www.cnblogs.com/Yuri/archive/2007/07/28/834227.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.cnblogs.com/Yuri/comments/commentRss/834227.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/Yuri/services/trackbacks/834227.html</trackback:ping><description><![CDATA[<p align="right"><a href="http://yuri.cnblogs.com/">http://yuri.cnblogs.com/</a></p>
<p align="left">　　貌似Tri-Mesh之间的CD好像不是很容易实现（尤其是三角形求交），而且时间也不多了，就这样，从头总结一下。另外放个演示程序，由于Tri-Mesh之间的CD未完成，没法放入那些物体，所以只有球和静态物体：<br />
<img height="247" alt="" src="http://www.cnblogs.com/images/cnblogs_com/yuri/96929/ball-trimesh.PNG" width="376" border="0" /><br />
纯属无聊摆的&#8230;&#8230;演示里没有用broad-phase碰撞检测（因为以后打算加上GraphicEngine的场景树），直接mid-phase<br />
下载地址：<a href="http://www.cnblogs.com/Files/Yuri/Ball_Tri-mesh.rar">http://www.cnblogs.com/Files/Yuri/Ball_Tri-mesh.rar</a><br />
运行需要：.Net Framework 2.0<br />
{<br />
BTW：<br />
抽空做了少部分D3D渲染子系统，暂时够用，这样就能体现图形层的特性了，两套3DAPI随便选（不过D3D好像有点慢）。<br />
用D3D有些怪事，我发现设备一创建，数学运算就有误差了，有的就不正确比如Math.Round。你可以选择不同的渲染子系统渲染，这样你就会发现物理模拟结果也不同-_-b<br />
}<br />
操作：<br />
WASD：前后左右平移<br />
Space、Ctrl：上下平移<br />
QE：翻滚<br />
&#8593;&#8595;&#8594;&#8592; ：转动视角<br />
IJKL：给某个小球前后左右加速度<br />
UM：给某个小球竖直上下加速度<br />
为了改进控制手感，最好将全局恢复系数比率设为0%（选择&#8220;物理&#8221;，设置Elasity为0）<br />
<br />
EDIT：<br />
07.11.26<br />
　　大改了一顿物理引擎，加入CollisionShape，并且准备ContactGraph。<br />
　　D3D渲染子系统不再基于Microsoft Managed DirectX，而是SlimDX（支持.Net2.0）<br />
<br />
好了，言归正传。<br />
<h2 align="center"><span style="font-size: 14pt">Broad-phase碰撞检测</span></h2>
<p align="left"><span style="font-family: Comic Sans MS">Sweep and Prune：<br />
</span><strong>1.</strong>将物体的AABB分离到三个坐标轴上。得到若干个区间。<br />
<strong>2.</strong>根据区间的终点坐标由小到大排序。<br />
<strong>3.</strong>逐个遍历排序结果，当遇到一个区间的起始点的时候，就将这个区间放到一个列表中；当遇到一个区间的终点时，就将这个区间从列表中清除。<br />
　当在列表中存在区间，而又遇到一个新区间的起始点时，则遇到的区间与列表中的所有区间重叠。<br />
<strong>4.</strong>如果一对物体在三个坐标轴上的区间都重叠，那么他们的AABB相叠。<br />
<h2 align="center"><span style="font-size: 14pt">Mid-phase碰撞检测</span></h2>
碰撞检测树就是将要碰撞的网格分离成多个部分，并将这些部分按树的结构组织起来。<br />
我的碰撞检测树就是一BVH树，和标准的AABB碰撞检测树相比，AABB树是2叉树，我的树的节点数是不定的。<br />
<span style="font-size: 14pt"><strong>两种建树过程如下：</strong></span>
<table style="width: 640px; border-collapse: collapse" cellspacing="0" cellpadding="3" border="1">
    <tbody>
        <tr>
            <td>
            <p>AABB：</p>
            <p><strong>1.</strong>计算三角形集合的AABB包围体<br />
            <strong>2.</strong>找出一个平面，这平面能最大限度的分割三角形集合（一般在中心即可），这个平面必须与坐标平面平行（因为包围体是AABB）<br />
            <strong>3.</strong>穿过这个平面的三角形按中点分配到平面一侧，如果中点还在平面上，随便分配<br />
            <strong>4.</strong>将分出的这两部分作为子节点继续分割（步骤1），直到分出的部分只有一个三角形 <br />
            </p>
            </td>
            <td>&nbsp;&nbsp;&nbsp; 　　</td>
            <td>我的碰撞检测树：<br />
            <strong>1.</strong>计算三角形集合的包围体<br />
            <strong>2.</strong>计算三角形集合的几何重心，将几何重心视为原点，按三个坐标平面将三角形集合分成8部分<br />
            <strong>3.</strong>穿过这个坐标平面的三角形按中点分配到平面一侧，如果中点还在平面上，随便分配<br />
            <strong>4.</strong>如果有的部分中没三角形，那么去掉它。如果只有一部分且这部分包含多个三角形，强行随便的将这部分分成多部分（防止死递归）。<br />
            <strong>5.</strong>将分出的n部分作为子节点继续分割（步骤1），直到分出的部分只有一个三角形</td>
        </tr>
    </tbody>
</table>
我的树可能不如AABB树平衡，可能性能稍差。<br />
<br />
<table style="width: 320px; border-collapse: collapse" cellspacing="0" cellpadding="3" border="1">
    <tbody>
        <tr>
            <td>包围体有：</td>
        </tr>
        <tr>
            <td>
            <p>包围球<br />
            AABB<br />
            OBB<br />
            &#8230;&#8230;</p>
            </td>
        </tr>
    </tbody>
</table>
注：<br />
　碰撞检测树一般在物体定坐标系下建立出来<br />
　可以根据情况，为不同节点选择不同类型的包围体，使得包围体包围得最紧凑<br />
<br />
<span style="font-size: 14pt"><strong>碰撞检测：</strong><br />
</span><span style="font-size: 12pt"><u>一个几何图形vs树</u><br />
</span>　　按深度优先或广度优先遍历树，对于非最末级节点，判断几何图形是否和节点包围体相交，如果相交那么继续遍历它的子节点。对于最末级节点，还要进行几何图形和最末节点所对应的三角形求交。这样，遍历完一次即可找到所有碰撞。<br />
<br />
注：<br />
　<strong>1.</strong>碰撞检测需检测出碰撞点，碰撞法向量，和刺穿深度<br />
　<strong>2.</strong>球和三角形碰撞：<br />
　　以下过程按顺序执行，一旦相交就return，停止和这个三角形继续检测：<br />
　　　(1).判断球心与三角面垂直且过三边的平面的位置关系，如果被包围，那么直接判断球心到三角面所在平面距离是否&lt;=半径<br />
　　　(2).根据(1)的结果，如果球心在哪条边外，那么试着和那条线段求交<br />
　　　(3).判断球心到三角形某顶点距离&lt;=半径<br />
　<strong>3.</strong>球和棱、点碰撞，碰撞法向量为那个面在碰撞点的切平面的法向量<br />
　<strong>4.</strong>通过更精确的包围体测试，会遍历更少节点，但更精确的包围体测试一般会花更多时间。<br />
<br />
<span style="font-size: 12pt"><u>树vs树</u></span><br />
　　对于一对节点，判断两个节点的包围体是否相交。如果相交，那么测试它们的子节点包围体是否相交。<br />
如果有一个节点是最末级节点，它对应着一个三角形，另一个是一个非最末级节点，那么问题转化为上面&#8220;一个几何图形vs树&#8221;。<br />
如果两个节点都是最末级节点，那么进行三角形求交。<br />
<br />
注：<br />
　对于刚体，它们会转动，转动了的AABB可以用AABB加上一个刚体变换矩阵表示。也可懒一些，直接把树放入全局坐标系下，更新树。<br />
<br />
<br />
<strong style="font-size: 14pt">树的更新：<br />
</strong>　　如果物体不是刚体，可能会形变，这就需要更新树。一般自下而上的更新树。先根据最末级节点对应的三角形，更新最末级节点。然后一级一级更新上面的节点，使它们的包围体包住子节点。<br />
<br />
<br />
以后安排（先把想法记下来）<br />
物体破裂 ：<br />
将物体网格表示成一张无向图（不用邻接矩阵表示），在压强足够大的地方细化网格，细化出的部分作为图的一部分，然后从压强足够大的几个顶点遍历图。遍历时根据物体物理材质选择图的边（第一条边应选择最和切向量正交的），将其并入断裂线，必要时就细化网格，直到这条线首尾封闭。这样做是因为不同材质的物体，其断裂口有的光滑，有的粗糙，甚至有尖刺。这样应该能生成一条满意的断裂线。然后取出子图，成为分裂出的物体的网格的一部分。不过断口的填充就暂无想法了&#8230;&#8230;<br />
<br />
脚本：<br />
设想了一种托管脚本。先写好脚本，经过编译器将其编译为自定的较低级中间语言，或者直接IL代码。运行前加载时，对其进行JIT编译，除了.Net的JIT以外，还有自己的一些，当然肯定是自己先处理后再交给.Net&#8230;&#8230;这样脚本最终就是本机代码，执行速度比解释型的快，而且异常也不用一下一下的考虑。<br />
一开始编译为直接IL代码时，不能直接转为它的字节码，而是自己规定的字节码，但其指令还是一一对应的（就是把IL代码用2进制形式表示了一下）。这主要是因为代码中有一些东西，还不能直接转为标准的IL字节码<br />
<br />
最终应该可以构建复杂的物体，比如一个人，由Joint、刚体（骨骼和关节）和柔体（头发和肥膘）组成。他做个什么动作要是碰到了什么倒是自然能模拟出来。不过他的行走，怎么维持重心不好说，我的想法是对已做好的动画解析，将其数值微分，最后算出各部分的作用力&#8230;&#8230;维持重心不管他用那些肌肉，维持重心的力 应该包括在里面&#8230;&#8230;<br />
以前有外国人拟做过类似的东西，第六届全国中小学电脑制作活动上还有即将得一得奖的抄过——botz，一个2D质点弹簧系统模拟程序，它的欧拉法积分不严密（或者说就不是），碰撞检测就和边界检查了一下，但是要注意他的&#8220;肌肉&#8221;思想，质点弹簧系统组成机器人，然后肌肉伸缩运动，我这个应该和那个在这一点有着类似之处。更接近一点的东西就是Dr.Jan Bender的那些机器人了。<br />
当然稍微遥远的东西别想得太多，毕竟还有不少东西未完成&#8230;&#8230; 
<img src ="http://www.cnblogs.com/Yuri/aggbug/834227.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/43770/" target="_blank">[新闻]苹果正调查MacBook笔记本“黑屏死机”故障</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>碰撞检测阶段总结</title><link>http://www.cnblogs.com/Yuri/archive/2007/07/13/814847.html</link><dc:creator>Yuri</dc:creator><author>Yuri</author><pubDate>Fri, 13 Jul 2007 15:54:00 GMT</pubDate><guid>http://www.cnblogs.com/Yuri/archive/2007/07/13/814847.html</guid><wfw:comment>http://www.cnblogs.com/Yuri/comments/814847.html</wfw:comment><comments>http://www.cnblogs.com/Yuri/archive/2007/07/13/814847.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/Yuri/comments/commentRss/814847.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/Yuri/services/trackbacks/814847.html</trackback:ping><description><![CDATA[<p>最近调整碰撞检测，总结出以下：<br>(1).球和棱碰撞，碰撞法向量不是与棱相接的两个平面的法向量的和的单位向量，而是碰撞点到球心的向量。法向量要先求出，然后才能算碰撞点，法向量可以通过表示棱的向量 和 棱上一点到球心向量 的向量三重积求出。<br>球和点碰撞法向量好找，就是半径向量。<br>即：面和棱、点碰撞，碰撞法向量为那个面在碰撞点的切平面的法向量<br></p>
<p>(2)碰撞检测树可以改进成多种节点相结合的，让它们都实现一个接口ICollisionTreeNode，抽象出来method和property，分割时估算一下顶点线性相关程度，然后再选择子节点类型。</p>
<p>BTW：<br>发现最基础的问题比如几何体求交，别人都不怎么重视。也许是他们足够NB，不需要注意。一个球和三角形求交，还不是最精确的（边的求交不是直线和二次曲面求交那种，这种一个球和一条线段只能求出一个点），竟然被我弄了好几天才弄出来（+优化）。以后加上任意形状刚体那估计更不好说。<br>由于建碰撞树时的近似处理，当分割较BT的网格时，一个大的三角形组将会 分不成 多个小三角形组，造成递归至堆栈溢出。所以应该狠一下，精确处理。<br><br><br><br>至此，球和Tri-mesh的碰撞检测&amp;处理就彻底OK了。接下来是Tri-mesh和Tri-mesh的&#8230;&#8230;另外，最好实现OBB树。<br>当然，与平面有关的就比较简单，不提了。<br>球和Tri-mesh碰撞包括：<br>　　球和静态物体的碰撞<br>　　球和任意刚体的碰撞<br><br>留图<br><img height=480 alt="" src="http://www.cnblogs.com/images/cnblogs_com/yuri/96929/r_teapot_ball_2.PNG" width=532 border=0><br><br>附：<br>球和三角形相交检测，以下过程按顺序执行，一旦相交就return，停止和这个三角形继续检测：<br>(1).判断球心与三角面垂直且过三边的平面的位置关系，如果被包围，那么直接判断球心到三角面所在平面距离是否&lt;=半径<br>(2).根据(1)的结果，如果球心在哪条边外，那么试着和那条线段求交<br>(3).判断球心到三角形某顶点距离&lt;=r<br><br>球和线段求交：<br>(1).计算线段包围球，检查求和这个包围球是否相交（好像可以省略判断，速度差不多）<br>(2).若相交，用一开始提到的向量三重积计算出法向量，用投影长算距离，算碰撞位置。<br>(3).判断距离是否小于半径 且 碰撞位置在线段包围球内<br></p>
代码<br>（注：Intersect是包围球的一个方法，包围球有字段vCentre,dRange，<br>%为向量积运算符，&amp;为两点距离运算符，^为两点距离平方运算符）
<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 id=Codehighlighter1_8_69_Open_Image onclick="this.style.display='none'; Codehighlighter1_8_69_Open_Text.style.display='none'; Codehighlighter1_8_69_Closed_Image.style.display='inline'; Codehighlighter1_8_69_Closed_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_8_69_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_8_69_Closed_Text.style.display='none'; Codehighlighter1_8_69_Open_Image.style.display='inline'; Codehighlighter1_8_69_Open_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" align=top><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_8_69_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/**/</span><span id=Codehighlighter1_8_69_Open_Text><span style="COLOR: #808080">///</span><span style="COLOR: #008000">&nbsp;</span><span style="COLOR: #808080">&lt;summary&gt;</span><span style="COLOR: #008000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #808080">///</span><span style="COLOR: #008000">&nbsp;判断线段是否和包围球相交<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #808080">///</span><span style="COLOR: #008000">&nbsp;</span><span style="COLOR: #808080">&lt;/summary&gt;</span><span style="COLOR: #808080"></span></span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">bool</span><span style="COLOR: #000000">&nbsp;Intersect(Vector&nbsp;vStart,&nbsp;Vector&nbsp;vEnd,&nbsp;</span><span style="COLOR: #0000ff">out</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">double</span><span style="COLOR: #000000">&nbsp;dist,&nbsp;</span><span style="COLOR: #0000ff">out</span><span style="COLOR: #000000">&nbsp;Vector&nbsp;n,&nbsp;</span><span style="COLOR: #0000ff">out</span><span style="COLOR: #000000">&nbsp;Vector&nbsp;pos)<br><img id=Codehighlighter1_183_748_Open_Image onclick="this.style.display='none'; Codehighlighter1_183_748_Open_Text.style.display='none'; Codehighlighter1_183_748_Closed_Image.style.display='inline'; Codehighlighter1_183_748_Closed_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_183_748_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_183_748_Closed_Text.style.display='none'; Codehighlighter1_183_748_Open_Image.style.display='inline'; Codehighlighter1_183_748_Open_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_183_748_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cnblogs.com/Images/dot.gif"></span><span id=Codehighlighter1_183_748_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Vector&nbsp;v&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0.5</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;(vStart&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;vEnd);<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">double</span><span style="COLOR: #000000">&nbsp;r&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0.5</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;(vStart&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;vEnd);<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;((v&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;vCentre)&nbsp;</span><span style="COLOR: #000000">&lt;=</span><span style="COLOR: #000000">&nbsp;(r&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;dRange))<br><img id=Codehighlighter1_337_628_Open_Image onclick="this.style.display='none'; Codehighlighter1_337_628_Open_Text.style.display='none'; Codehighlighter1_337_628_Closed_Image.style.display='inline'; Codehighlighter1_337_628_Closed_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_337_628_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_337_628_Closed_Text.style.display='none'; Codehighlighter1_337_628_Open_Image.style.display='inline'; Codehighlighter1_337_628_Open_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_337_628_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cnblogs.com/Images/dot.gif"></span><span id=Codehighlighter1_337_628_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Vector&nbsp;v1&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;(vCentre&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">&nbsp;vEnd);<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Vector&nbsp;v2&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;(vStart&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">&nbsp;vEnd);<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;n&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;(v2&nbsp;</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">&nbsp;v1&nbsp;</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">&nbsp;v2).UnitVector;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dist&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;v1&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;n;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pos&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;vCentre&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">&nbsp;dist&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;n;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&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">&nbsp;(dist&nbsp;</span><span style="COLOR: #000000">&lt;=</span><span style="COLOR: #000000">&nbsp;dRange)&nbsp;</span><span style="COLOR: #000000">&amp;&amp;</span><span style="COLOR: #000000">&nbsp;((pos&nbsp;</span><span style="COLOR: #000000">^</span><span style="COLOR: #000000">&nbsp;v)&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">&nbsp;r&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;r);<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dist&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.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;n&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;Vector();<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pos&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;Vector();<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">false</span><span style="COLOR: #000000">;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span></div>
<img src ="http://www.cnblogs.com/Yuri/aggbug/814847.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/43769/" target="_blank">[新闻]007最牛电脑探秘：应用界面来自中国(组图)</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>以前的错误理解</title><link>http://www.cnblogs.com/Yuri/archive/2007/07/09/810637.html</link><dc:creator>Yuri</dc:creator><author>Yuri</author><pubDate>Mon, 09 Jul 2007 15:30:00 GMT</pubDate><guid>http://www.cnblogs.com/Yuri/archive/2007/07/09/810637.html</guid><wfw:comment>http://www.cnblogs.com/Yuri/comments/810637.html</wfw:comment><comments>http://www.cnblogs.com/Yuri/archive/2007/07/09/810637.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/Yuri/comments/commentRss/810637.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/Yuri/services/trackbacks/810637.html</trackback:ping><description><![CDATA[摘要: 接触处理的本质是用冲量分离刺穿，而不是接触了就给个支持力。<br>由于碰撞检测使用的不是连续碰撞检测，所以检测到的时候总会已经发生一些刺穿，碰撞检测会检测出刺穿法向分量和切线分量，然后计算补偿冲量分离刺穿。<br>如果给个支持力，是没有道理的，碰撞处理给的冲量已经满全满足了它。<br>{<br>从式子上可以看出，比如质点和平面碰撞冲量：Pn=-(1+e)*Vrn*m，物体在平面上放着，每次积分后，物体会因重力造成Vrn=g*dt，代入即F=-(1+e)*mg，<br>取极端情况e=0或1，<br>最少e=0时，够提供支持力-mg，<br>如果e=1，物体会受到向上的合力-mg。假设我们的数值积分是理想的，和真的定积分一样，那么dt后，物体会在平面上0.5*g*dt*dt处。然后他又落下来，碰撞接触速度为g*dt，和前面Vrn一样，所以它会不断地这样下去。由于理想化了积分，即dt的d是真的d， :-)，所以(0.5*g*dt*dt)→0，所以物体会不动。<br>现在面对现实，dt也就是个1~5毫秒，质点位置就会处于数值动态平衡中，应该基本看不出来。。。<br><br>&nbsp;&nbsp;<a href='http://www.cnblogs.com/Yuri/archive/2007/07/09/810637.html'>阅读全文</a><img src ="http://www.cnblogs.com/Yuri/aggbug/810637.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/43768/" target="_blank">[新闻]新浪网遭攻击瘫痪500分钟 被迫答应黑客要求</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>多对碰撞点的碰撞处理</title><link>http://www.cnblogs.com/Yuri/archive/2007/07/05/807390.html</link><dc:creator>Yuri</dc:creator><author>Yuri</author><pubDate>Thu, 05 Jul 2007 09:00:00 GMT</pubDate><guid>http://www.cnblogs.com/Yuri/archive/2007/07/05/807390.html</guid><wfw:comment>http://www.cnblogs.com/Yuri/comments/807390.html</wfw:comment><comments>http://www.cnblogs.com/Yuri/archive/2007/07/05/807390.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cnblogs.com/Yuri/comments/commentRss/807390.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/Yuri/services/trackbacks/807390.html</trackback:ping><description><![CDATA[<p align=right>&nbsp;<span>假设：你已经熟悉单点带摩擦冲量问题。</span></p>
<p><span>　　对于有多对碰撞点的碰撞处理工作如下。</span></p>
<p><span>　　首先，根据牛顿碰撞定律将每对碰撞点的碰后相对速度<img height=18 alt="" src="http://www.cnblogs.com/images/cnblogs_com/yuri/96930/o_urelcn.PNG" width=38 border=0>算出来</span><span> </span><span>。然后碰撞冲量将会在一个迭代循环中计算出来。在第i</span><span>次迭代时，对于每一组碰撞点，我们将测试碰前相对速度<img height=17 alt="" src="http://www.cnblogs.com/images/cnblogs_com/yuri/96930/o_ureln.PNG" width=35 border=0></span><span> </span><span>是否已经达到了之前求出的相应的碰后相对速度</span><span> <img height=18 alt="" src="http://www.cnblogs.com/images/cnblogs_com/yuri/96930/o_urelcn.PNG" width=38 border=0></span><span>。如果是，我们就直接处理下一对碰撞点。否则就按老样子计算冲量<img height=21 alt="" src="http://www.cnblogs.com/images/cnblogs_com/yuri/96930/o_pni.PNG" width=33 border=0></span><span> </span><span>，并且作用在刚体上。直到所有对碰撞点都不需要计算。</span></p>
<p><span>另外，为了防止碰撞物体相互</span><span>sticking</span><span>，必须保证在每次迭代中，每对碰撞点的合冲量必须在正法向量方向，即：</span></p>
<p>
<div align=center src_cetemp="/images/cnblogs_com/yuri/96930/o_cond2.PNG"><img height=70 alt="" src="http://www.cnblogs.com/images/cnblogs_com/yuri/96930/o_cond2.PNG" width=125 border=0></div>
<p>&#160;</p>
<p><span>如果上式在i</span><span>次迭代时成立，而在第i-1</span><span> </span><span>次迭代时不成立，那么则需</span><span><br></span></p>
<p align=center>&nbsp;<img height=70 alt="" src="http://www.cnblogs.com/images/cnblogs_com/yuri/96930/o_cond1.PNG" width=162 border=0></p>
<p><span>就是说</span></p>
<p>
<div align=center src_cetemp="/images/cnblogs_com/yuri/96930/o_pnieqv.PNG"><img height=123 alt="" src="http://www.cnblogs.com/images/cnblogs_com/yuri/96930/o_pnieqv.PNG" width=249 border=0></div>
<p>&#160;</p>
<p><span>　　对了，别忘了摩擦冲量</span><span>。摩擦冲量是在碰撞法向冲量的基础上产生的，因此，摩擦冲量要和碰撞冲量在同一个迭代循环中求出。它的计算是基于</span><span>Coulomb</span><span>摩擦力法则的。如果切线相对速度分量<img height=17 alt="" src="http://www.cnblogs.com/images/cnblogs_com/yuri/96930/o_urelteqv.PNG" width=129 border=0></span><span> </span><span>不是</span><strong><span>0</span></strong><span>。我们会计算一个冲量来模拟动摩擦力，方向是切线速度的相反方向，切线向量</span><span><strong><em>t</em></strong></span><span>我们用法向量</span><span><em><strong>n</strong></em></span><span>和相对速度</span><span><img height=17 alt="" src="http://www.cnblogs.com/images/cnblogs_com/yuri/96930/o_urel.PNG" width=28 border=0></span><span>的向量三重积算出来。在第</span><span>i</span><span>次迭代中，一对碰撞点的摩擦冲量可以由下式算出：<br></p>
<div align=center src_cetemp="/images/cnblogs_com/yuri/96930/o_ptieqv2.PNG"><img height=23 alt="" src="http://www.cnblogs.com/images/cnblogs_com/yuri/96930/o_ptieqv2.PNG" width=103 border=0></div>
<div src_cetemp="/images/cnblogs_com/yuri/96930/o_ptieqv2.PNG"><br></span><span>其中<img height=16 alt="" src="http://www.cnblogs.com/images/cnblogs_com/yuri/96930/o_ud.PNG" width=22 border=0></span><span> </span><span>就是动摩擦系数。在我们把这个冲量作用到刚体上碰撞位置前，必须保证切线速度</span><span><img height=19 alt="" src="http://www.cnblogs.com/images/cnblogs_com/yuri/96930/o_urelt.PNG" width=34 border=0></span><span>在</span><span><strong><em>t</em></strong></span><span>的相反方向，因为摩擦力是使接触点的相对速度减小的。那么允许的极端情况就是摩擦冲量使切线相对速度为</span><strong><span>0</span></strong><span>。即：</span></div>
<p align=center>&nbsp;<img height=95 alt="" src="http://www.cnblogs.com/images/cnblogs_com/yuri/96930/o_ptmaxeqv.PNG" width=375 border=0></p>
<p><span>好了，考虑上<img height=21 alt="" src="http://www.cnblogs.com/images/cnblogs_com/yuri/96930/o_ptmax.PNG" width=42 border=0></span><span> </span><span>，即：</span></p>
<p align=center>&nbsp;<img height=95 alt="" src="http://www.cnblogs.com/images/cnblogs_com/yuri/96930/o_ptieqv.PNG" width=249 border=0></p>
<img src ="http://www.cnblogs.com/Yuri/aggbug/807390.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/43767/" target="_blank">[新闻]联发科称“死机短信”不会伤害手机硬件</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>碰撞检测演示</title><link>http://www.cnblogs.com/Yuri/archive/2007/07/03/803735.html</link><dc:creator>Yuri</dc:creator><author>Yuri</author><pubDate>Mon, 02 Jul 2007 19:06:00 GMT</pubDate><guid>http://www.cnblogs.com/Yuri/archive/2007/07/03/803735.html</guid><wfw:comment>http://www.cnblogs.com/Yuri/comments/803735.html</wfw:comment><comments>http://www.cnblogs.com/Yuri/archive/2007/07/03/803735.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/Yuri/comments/commentRss/803735.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/Yuri/services/trackbacks/803735.html</trackback:ping><description><![CDATA[<embed src=http://www.youtube.com/v/7VJhAoMHqSk width=425 height=350 type=application/x-shockwave-flash></embed><br>后续安排：<br>基本物体之间的碰撞检测&amp;处理（柔体除外）<br>完善接触处理<br>BallJoint、StickJoint等<br>刚体破碎 <br><br>EDIT：<br>弄了个更复杂的测试<br><img style="WIDTH: 322px; HEIGHT: 290px" height=290 alt="" src="http://www.cnblogs.com/images/cnblogs_com/Yuri/96929/o_scene.png" width=322 border=0><br><embed src=http://www.youtube.com/v/wwJ-Qj3C7Cc width=425 height=350 type=application/x-shockwave-flash></embed><br>三角形数约：4300<br>动摩擦系数=静摩擦系数=0.5<br>恢复系数=0.5<br><br>结论：<br>最终碰撞 &amp; 剪枝 仍需完善。尤其是最终碰撞——球和三角形的求交比较麻烦，我没考虑和边碰撞。由此造成：三角形数越多越好（减少没检测出的可能性），但也别太多。<br>AABB更高效，尽管AABB的剪枝更复杂（不像包围球考虑个半径就行了），但它剪枝剪得更彻底<br>我用包围球树时，按物理fps上限为10000的速度跑（物理单独MTA线程），在有些时候——球临近静态物体时会有卡的现象，用AABB树按每秒10000次模拟步没什么问题&#8230;&#8230;由此我们也可以看到效率瓶颈在球和三角形求交上。<br>
<img src ="http://www.cnblogs.com/Yuri/aggbug/803735.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/43766/" target="_blank">[新闻]金融危机引爆Web2.0变革：社区网站价值被高估</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>四元数摄像机</title><link>http://www.cnblogs.com/Yuri/archive/2007/07/01/802376.html</link><dc:creator>Yuri</dc:creator><author>Yuri</author><pubDate>Sun, 01 Jul 2007 14:32:00 GMT</pubDate><guid>http://www.cnblogs.com/Yuri/archive/2007/07/01/802376.html</guid><wfw:comment>http://www.cnblogs.com/Yuri/comments/802376.html</wfw:comment><comments>http://www.cnblogs.com/Yuri/archive/2007/07/01/802376.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/Yuri/comments/commentRss/802376.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/Yuri/services/trackbacks/802376.html</trackback:ping><description><![CDATA[摘要: 无万向锁，旋转绝对自由。就是不好控制BTW：这是渲染引擎部件之一。CCamera可以用于设置RenderTarget，而CViewerCamera则是给用户3D漫游用的publicclassCCamera{Matrix4x4mViewMatrix,mProjMatrix;protectedVectormPosition;protectedQuaternionmOri;protectedVector&nbsp;&nbsp;<a href='http://www.cnblogs.com/Yuri/archive/2007/07/01/802376.html'>阅读全文</a><img src ="http://www.cnblogs.com/Yuri/aggbug/802376.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/43765/" target="_blank">[新闻]MySpace称目前是收购创业公司良机</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>非标准物理重心</title><link>http://www.cnblogs.com/Yuri/archive/2007/07/01/802308.html</link><dc:creator>Yuri</dc:creator><author>Yuri</author><pubDate>Sun, 01 Jul 2007 13:25:00 GMT</pubDate><guid>http://www.cnblogs.com/Yuri/archive/2007/07/01/802308.html</guid><wfw:comment>http://www.cnblogs.com/Yuri/comments/802308.html</wfw:comment><comments>http://www.cnblogs.com/Yuri/archive/2007/07/01/802308.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/Yuri/comments/commentRss/802308.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/Yuri/services/trackbacks/802308.html</trackback:ping><description><![CDATA[<img height=404 alt="" src="http://www.cnblogs.com/images/cnblogs_com/yuri/96929/o_nonstd.PNG" width=488 border=0><br>
<p>非标准物理重心，以前每次都是简化了模型，让物理重心和几何重心一样，这次一般化，物理重心由以下式子可算出<br><img height=125 alt="" src="http://www.cnblogs.com/images/cnblogs_com/yuri/cgp.PNG" width=151 border=0><br>演示视频中的小球的重心靠下（下方密度较大），所以它像个不倒翁一样晃&#8230;&#8230; <br>
<object width="425" height="350"><param name="movie" value="http://www.youtube.com/v/XXcGh9w9YJg"></param><embed src="http://www.youtube.com/v/XXcGh9w9YJg" type="application/x-shockwave-flash" width="425" height="350"></embed></object>
<br>如果一开始产生的水平分速度再大点，那么小球就应该会一快一慢的滚动起来 ，然后滚出地面，掉下去。。</p><img src ="http://www.cnblogs.com/Yuri/aggbug/802308.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/43765/" target="_blank">[新闻]MySpace称目前是收购创业公司良机</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>OpenGL射线拾取</title><link>http://www.cnblogs.com/Yuri/articles/786843.html</link><dc:creator>Yuri</dc:creator><author>Yuri</author><pubDate>Sun, 17 Jun 2007 15:57:00 GMT</pubDate><guid>http://www.cnblogs.com/Yuri/articles/786843.html</guid><wfw:comment>http://www.cnblogs.com/Yuri/comments/786843.html</wfw:comment><comments>http://www.cnblogs.com/Yuri/articles/786843.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/Yuri/comments/commentRss/786843.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/Yuri/services/trackbacks/786843.html</trackback:ping><description><![CDATA[摘要: 用鼠标选择网格上的三角形。主要步骤： 1. 每次渲染设置摄像机后，用gluUnProject得到拾取射线，然后和每个三角形所在平面求交。 2. 若拾取起点到交点的向量 和 拾取射线向量的数量积大于0（即三角形在观察者前方），则判断是点是否在三角形内。 3. 若在，则 这个三角形被选择。由于要不断求交，实际用的时候应该考虑粗略判断，以便减少求交次数。 代码如下（c#）： namespaceRayPi&nbsp;&nbsp;<a href='http://www.cnblogs.com/Yuri/articles/786843.html'>阅读全文</a><img src ="http://www.cnblogs.com/Yuri/aggbug/786843.html?type=2" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/43764/" target="_blank">[新闻]诺基亚推出触摸屏手机N97</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item></channel></rss>