⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tutorial_40.htm

📁 如果你相信它就好好学学吧,同样这里也只是个入门
💻 HTM
📖 第 1 页 / 共 2 页
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><html><head><!-- 这篇文章由Dancingwind翻译,作者的联系方式zhouwei02@mails.tsinghua.edu.cn --><title>NeHe OpenGL教程第四十课,DancingWind翻译</title>


<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<style type="text/css">
A:link {COLOR: #ccaaff; TEXT-DECORATION: none}
A:visited {COLOR: #ccaaff; TEXT-DECORATION: none}
A:active {COLOR: #ccaaff; TEXT-DECORATION: none}
A:hover {COLOR: #ffccaa; TEXT-DECORATION: none}
</style></head><body bgcolor="#000000" text="#ffffff"><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td height="130" width="326"><img src="Tutorial_40_files/logo.png" height="130" width="326"></td>
    <td align="center" valign="middle" width="75%"><font color="#ffccaa" size="+3"><b><i>第40课</i></b></font></td>
  </tr></tbody></table>
  <!-- 上边框-->
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
  <tr>
    <td><img src="Tutorial_40_files/tl.jpg" height="28" width="28"></td>
    <td width="100%"><img src="Tutorial_40_files/tc.gif" height="28" width="100%"></td>
    <td><img src="Tutorial_40_files/tr.gif" height="28" width="28"></td>
  </tr>
</tbody>
</table>

<!-- 中部-->
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
  <tr>
  	<!-- 中部左边框-->
    <td background="Tutorial_40_files/l.gif"><img src="Tutorial_40_files/l.gif" height="28" width="28"></td>
	<!-- 中部文字部分-->
    <td valign="top" width="100%">
	<table border="0" width="100%">
          <tbody><tr>
            <td width="31%"><img src="Tutorial_40_files/lesson40.jpg" height="180" width="240"></td>
            <td width="69%"><p><font class="head">绳子的模拟:</font></p>
              <p><font size="3">怎样模拟一根绳子呢,把它想象成一个个紧密排列的点,怎么样有了思路了吧,在这一课你你将学会怎样建模,简单吧,你能模拟更多。</font></p></td>
          </tr>
     </tbody></table>
      </td>
	<!-- 中部右边框-->
    <td background="Tutorial_40_files/r.gif"><img src="Tutorial_40_files/r.gif" height="28" width="28"></td>
  </tr>
</tbody>
</table>

<!-- 下边框-->
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
  <tr>
    <td><img src="Tutorial_40_files/bl.gif" height="28" width="28"></td>
    <td width="100%"><img src="Tutorial_40_files/bc.gif" height="28" width="100%"></td>
    <td><img src="Tutorial_40_files/br.gif" height="28" width="28"></td>
  </tr>
</tbody>
</table>
  <table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="Tutorial_40_files/tl.png" height="28" width="28"></td><td width="100%"><img src="Tutorial_40_files/tc.png" height="28" width="100%"></td><td><img src="Tutorial_40_files/tr.png" height="28" width="28"></td></tr></tbody></table><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td background="Tutorial_40_files/l.png"><img src="Tutorial_40_files/l.png"></td>
    <td valign="top" width="100%"><u>绳索模拟</u> <br> <br>
      在这个教程里我们将模拟一段绳索,我们是在39课的基础上进行的。<br> <br>
在物理模拟中,我们必须设置各个物理量,就像它们在自然界中的行为一样。模拟中的运动并不一定和自然界相同,我们使用的运动模型,必须和我们需要模拟的目
的有关,目的决定了它的精确度。要知道我们的目标不是模拟原子和分子,也不是模拟成千上万的粒子系。首先我们需要确定我们模拟的目标,才能创建我们的物理
模型。它和下面内容相关:<br> 
      <br> <font color="#ffffaa">1. 运动的数学表示<br>
      2. 执行模拟的计算机的速度</font><br> <br> <u>1. 运动的数学表示:</u> <br> <br>
      这个问题决定了我们使用何种数学方程来模拟运动,使用经典力学还是量子力学。<br> <br> <u>2. 执行模拟的计算机的速度:</u> <br> 
      <br>
      计算机的速度决定了我们可以模拟的精度。<br> <br> <u>设计绳索的物理模型:</u> <br> <br>
我们在经典力学和高于500Mhz的计算机上模拟这个问题。首先我们需要设定需要的精度,我们使用一系列互相用弹簧连接的质点来模拟绳索,精度决定了我们
用多少个点来模拟,当然越多越精确。在下面我决定用50或100个点来模拟绳子一段3或4m长的绳子,换句话说,我们的模拟精度就是3到8厘米。<br> 
      <br> <u>设计运动模型:</u> <br> <br>
      在绳子中,施加给各个质点的力来自于自身的质量和相连的内力(参见大学里的普通力学)。如下我们用"O"表示质点,“—”表示连接质点的弹簧。 
      <pre><font color="#ffffaa">O----O----O----O
1    2    3    4
</font></pre>
      <p>弹簧的力学公式如下: <br>
        <br>
        <font color="#aaffaa">力 = -k * x</font><br>
        <font color="#ffffaa">k: 弹性系数<br>
        x: 相距平衡位置的位移</font><br>
        <br>
        上面的公式说明,如果相邻点的距离为平衡距离,那么它们不受到任何力的作用。如果我们设置平衡位置为5cm,那么100个点的绳子长5m。如果相连质点之间的位置小于5cm,它们受到排斥力。<br>
        <br>
        上面的公式只是一个基础,现在我们可以加上摩擦力,如果没有这项,那么绳子将永远动下去。<br>
        <br>
        <u>弹簧类:</u> <br>
        <br>
        这个类包含相连接的两个物体,它们之间具有作用力。</p>
      </td>
    <td background="Tutorial_40_files/r.png"><img src="Tutorial_40_files/r.png"></td></tr></tbody></table>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
  <tbody>
  <tr>
    <td><img src="Tutorial_40_files/bl.png" height="28" width="28"></td>
    <td width="100%"><img src="Tutorial_40_files/bc.png" height="28" width="100%"></td>
    <td><img src="Tutorial_40_files/br.png" height="28" width="28"></td></tr></tbody></table>
<font color="#aaffaa" size="3"> 
<pre>class Spring									
{										
public:
	Mass* mass1;								<font color="#ffffaa">// 质点1</font>
	Mass* mass2;								<font color="#ffffaa">// 质点2</font>

	float springConstant;							<font color="#ffffaa">// 弹性系数</font>
	float springLength;							<font color="#ffffaa">//弹簧长度 </font>
	float frictionConstant;							<font color="#ffffaa">//摩擦系数</font>

	Spring(Mass* mass1, Mass* mass2,
		<font color="#ffffaa">// 构造函数</font>
		float springConstant, float springLength, float frictionConstant)
	{
		this-&gt;springConstant = springConstant;			
		this-&gt;springLength = springLength;				
		this-&gt;frictionConstant = frictionConstant;			

		this-&gt;mass1 = mass1;						
		this-&gt;mass2 = mass2;						
	}

	void solve()								<font color="#ffffaa">// 计算各个物体的受力</font>
	{
		Vector3D springVector = mass1-&gt;pos - mass2-&gt;pos;		
		
		float r = springVector.length();					<font color="#ffffaa">// 计算两个物体之间的距离</font>

		Vector3D force;							
		
		if (r != 0)							<font color="#ffffaa">// 计算力</font>
			force += -(springVector / r) * (r - springLength) * springConstant;
		...
</pre>
</font> <font color="#aaffaa" size="3"> 
<pre>		force += -(mass1-&gt;vel - mass2-&gt;vel) * frictionConstant;		<font color="#ffffaa">// 加上摩擦力</font>
		mass1-&gt;applyForce(force);					<font color="#ffffaa">	// 给物体1施加力</font>
		mass2-&gt;applyForce(-force);					<font color="#ffffaa">	// 给物体2施加力</font>
	}									</pre>
</font> 
<table border="0" cellpadding="0" cellspacing="0" width="100%">
  <tbody>
  <tr>
    <td><img src="Tutorial_40_files/tl.png" height="28" width="28"></td>
    <td width="100%"><img src="Tutorial_40_files/tc.png" height="28" width="100%"></td>
    <td><img src="Tutorial_40_files/tr.png" height="28" width="28"></td></tr></tbody></table>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
  <tbody>
  <tr>
    <td background="Tutorial_40_files/l.png"><img src="Tutorial_40_files/l.png"></td>
      <td valign="top" width="100%">下面我们把绳子钉在墙上,所以我们的模拟就多了一个万有引力,空气摩擦力。万有引力的公式如下:<br> 
        <br> <font color="#aaffaa">力 = (重力加速度) * 质量</font> <br> <br>
        万有引力会作用在每一个质点上,地面也会给每个物体一个作用力。在我们的模型中将考虑绳子和地面之间的接触,地面给绳子向上的力,并提供摩擦力。<br> 
        <br> <u>设置模拟的初始值</u><br> <br>
        现在我们已经设置好模拟环境了,长度单位是m,时间单位是秒,质量单位是kg。<br> <br>
        为了设置初始值,我们必须提供供模拟开始的参数。我们定义一下参数:<br> <br> <font color="#ffffaa">1. 重力加速度: 
        9.81 m/s/s 垂直向下<br>
        2. 质点个数: 80<br>
        3. 相连质点的距离: 5 cm (0.05 meters)<br>
        4. 质量: 50 克(0.05 kg)<br>
        5. 绳子开始处于垂直状态</font><br> <br>
        下面计算绳子受到的力<br> <br> <font color="#aaffaa">f = (绳子质量) * (重力加速度) = (4 kg) * (9.81) ~= 40 N</font> <br> 
        <br>
        弹簧必须平衡这个力 40 N,它伸长1cm,计算弹性系数: <br> <br> <font color="#aaffaa">合力= -k * x 
        = -k * 0.01 m</font> <br> <br>
        合力应该为0 : <br> <br> <font color="#aaffaa">40 N + (-k * 0.01 meters) = 0</font> <br> <br>
        弹性系数 k 为: <br> <br> <font color="#aaffaa">k = 4000 N / m</font> <br> <br>
        设置弹簧的摩擦系数: <br> <br> <font color="#aaffaa">springFrictionConstant = 0.2 N/(m/s)</font> <br> <br>
        下面我们看看这个绳索类:<br> <br> <table border="0">
          <tbody>
            <tr> 
              <td><font color="#aaffaa">1. virtual void init()</font></td>
              <td>---&gt; </td>
              <td><font color="#ffffaa">重置力</font></td>
            </tr>
            <tr></tr>
            <tr> 
              <td><font color="#aaffaa">2. virtual void solve()</font></td>
              <td>---&gt; </td>
              <td><font color="#ffffaa">计算各个质点的力</font></td>
            </tr>
            <tr></tr>
            <tr> 
              <td><font color="#aaffaa">3. virtual void simulate(float dt)</font></td>
              <td>---&gt; </td>
              <td><font color="#ffffaa">模拟一次</font></td>
            </tr>
            <tr></tr>
            <tr> 
              <td><font color="#aaffaa">4. virtual void operate(float dt)</font></td>
              <td>---&gt; </td>
              <td><font color="#ffffaa">执行一次操作</font></td>
            </tr>
          </tbody>
        </table>
        <br>
        绳索类如下所示 : </td>
    <td background="Tutorial_40_files/r.png"><img src="Tutorial_40_files/r.png"></td></tr></tbody></table>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
  <tbody>
  <tr>
    <td><img src="Tutorial_40_files/bl.png" height="28" width="28"></td>
    <td width="100%"><img src="Tutorial_40_files/bc.png" height="28" width="100%"></td>
    <td><img src="Tutorial_40_files/br.png" height="28" width="28"></td></tr></tbody></table>
<font color="#aaffaa" size="3"> 
<pre>class RopeSimulation : public Simulation					<font color="#ffffaa">//绳索类</font>
{
public:
	Spring** springs;							<font color="#ffffaa">// 弹簧类结构的数组的指针</font>

	Vector3D gravitation;						<font color="#ffffaa">// 万有引力</font>

	Vector3D ropeConnectionPos;						<font color="#ffffaa">// 绳索的连接点</font>
	
	Vector3D ropeConnectionVel;						<font color="#ffffaa">//连接点的速度,我们使用这个移动绳子</font>

	float groundRepulsionConstant;					<font color="#ffffaa">//地面的反作用力</font>
	
	float groundFrictionConstant;					<font color="#ffffaa">//地面的摩擦系数</font>
	
	float groundAbsorptionConstant;					<font color="#ffffaa">//地面的缓冲力</font>
	
	float groundHeight;						<font color="#ffffaa">//地面高度</font>

	float airFrictionConstant;						<font color="#ffffaa">//空气的摩擦系数</font></pre>
</font> 
<table border="0" cellpadding="0" cellspacing="0" width="100%">
  <tbody>
  <tr>
    <td><img src="Tutorial_40_files/tl.png" height="28" width="28"></td>
    <td width="100%"><img src="Tutorial_40_files/tc.png" height="28" width="100%"></td>
    <td><img src="Tutorial_40_files/tr.png" height="28" width="28"></td></tr></tbody></table>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
  <tbody>
  <tr>
    <td background="Tutorial_40_files/l.png"><img src="Tutorial_40_files/l.png"></td>
      <td valign="top" width="100%">下面是它的构造函数</td>
    <td background="Tutorial_40_files/r.png"><img src="Tutorial_40_files/r.png"></td></tr></tbody></table>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
  <tbody>
  <tr>
    <td><img src="Tutorial_40_files/bl.png" height="28" width="28"></td>
    <td width="100%"><img src="Tutorial_40_files/bc.png" height="28" width="100%"></td>
    <td><img src="Tutorial_40_files/br.png" height="28" width="28"></td></tr></tbody></table>
<font color="#aaffaa" size="3"> 
<pre>	RopeSimulation(								
		int numOfMasses,					
		float m,							
		float springConstant,					
		float springLength,						
		float springFrictionConstant,					
		Vector3D gravitation,						

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -