live2d模型怎么用,Box2D——入門教程

 2023-10-20 阅读 16 评论 0

摘要: 現在網上關于as3的物理引擎真是不少,比較之后發現,在開源引擎當中Box2D算是比較不錯的了,只可惜他的結構比較復雜,而且國內網站關于Box2D方面的教程真是少的可憐。因為我知道這個最早是c++上面的2D引擎,所以我找到了http://www.

 現在網上關于as3的物理引擎真是不少,比較之后發現,在開源引擎當中Box2D算是比較不錯的了,只可惜他的結構比較復雜,而且國內網站關于Box2D方面的教程真是少的可憐。因為我知道這個最早是c++上面的2D引擎,所以我找到了http://www.box2d.org/manual.html網址,經過幾天的研究,總算是入門了,下面我會系統的針對官網給出的HelloWorld程序進行講解,把個人心得分享給大家(鼓掌)!

  這個引擎是先從創建一個世界對象開始的,他負責管理內部一切對象的內存和模擬過程。要創建一個世界中的對象,首先我們需要為世界定義邊界區域,Box2D針對區域內的所有對象進行模擬碰撞,區域的大小并不重要,但更適合的區域將提高程序性能,一般來講這個區域設置的要比演示區域更大一些,因為一旦對象在運動時到達了邊界,它就會被“凍結”并停止一切模擬活動。

var worldAABB:b2AABB = new b2AABB();
worldAABB.lowerBound.Set(-100,-100);//左邊界、上邊界
worldAABB.upperBound.Set(100,100);//右邊界、下邊界

  下面我們要為這個世界設置重力了,就是下面這段代碼,其實這里面的重力是用向量b2Vec2(x,y);來表示的,x代表水平運動,正數向右,負數向左,y代表垂直運動,正數向下,負數向上。同時我們需要再定義一個布爾型參數(我命名為doSleep),來表示是否允許睡眠,睡眠所代表的含義網上也沒有一個明確的介紹,這里我簡要講解一下。因為你在這個世界中生成的一切對象,他們的模擬效果都是實時計算出來的,當doSleep=false的時候,即使物體停止了運動,計算機還是在不停的進行著運算,其實這是完全不必要的,所以一般都設為true,這樣當物體停止之后就不會進行無謂的cpu消耗了。

var gravity:b2Vec2 = new b2Vec2(0,10);
var doSleep:Boolean = true;

  以上參數都準備好了,我們可以將它們傳入b2World對象中并將其實例化,這樣一個物理引擎的模擬區域就做好了。

var world:b2World = new b2World(worldAABB,gravity,doSleep);

  讓我們開始在其中加入你想要模擬的對象吧。本來在那個英文網站中給出的是5個步驟,但是我感覺還少點什么,所以我又加了一條:
第一步、創建并定義剛體位置。這里我做一下名詞解釋,在任何力的作用下,體積和形狀都不發生改變的物體叫做“剛體”;

var ground:b2BodyDef = new b2BodyDef();
ground.position.Set(10, 12);//這里的位置也是用向量定義的

live2d模型怎么用、2、給剛體定義皮膚(注意這里的皮膚并不具備物理引擎的屬性,因此才有了第四步);

bodyDef.userData = _mc;//我們自己繪制的圖形
addChild(bodyDef.userData);

3、用世界對象添加剛體實例,需要注意的是世界對象里并沒有保存body定義的引用;

var body:b2Body = world.CreateBody(bodyDef);

4、根據皮膚形狀創建模擬圖形類:摩擦力、密度、彈力等等;當密度為0的時候,物體是不會動的,相當于障礙物。摩擦力和彈力取值范圍是0~1,形狀的區域是由SetAsBox定義的,因為模擬圖形和剛體都要求以中心點為注冊點,因此這里的寬和高的值都是一半,同時需要注意,這里數值單位并不是像素,而是米,1米=30像素,大家在傳值的時候可別忘記換算哦。

var box:b2PolygonDef = new b2PolygonDef();//創建多邊形
box.density = _density;
box.friction = _friction;
box.restitution = _restitution;
box.SetAsBox(_halfWidth , _halfHeight);

5、在剛體上添加模擬圖形實例;

body.CreateShape(box);

6、根據剛體的密度和面積計算出質量,密度*面積=質量。

body.SetMassFromShapes();

  這里有兩個重要的參數需要我們自己定義一下。一個是迭代次數,這里我定義為m_iterations,建議迭代次數為10,這時一個比較合理的值,使用較少的迭代可以提高性能,但模擬質量受到影響。同樣,使用更多的迭代性能有所下降,但提高了你的模擬質量。另外一個參數是游戲的刷新頻率,我定義為m_timeStep,根據英文教程上記載,它采用的是1/60秒刷新一次,但因為它的平臺是c++,性能比AVM2虛擬機高出數倍,完全可以這么做,而在flash中我們一般設置成1/30就可以了。

var m_iterations:Number = 10;
var m_timeStep:Number = 1 / 30;

live2d使用教程。  現在一切都準備好了,我們要讓所有對象模擬運動。其實他也是通過偵聽幀頻率而不斷刷新實現的,把上面那兩個參數傳入世界對象的Step方法中即可,同時我們需要遍歷世界中的一切對象,并對每個對象的坐標和角度進行更新。

addEventListener(Event.ENTER_FRAME, Update, false, 0, true);
function Update(e:Event):void
{world.Step(m_timeStep, m_iterations);for (var bb:b2Body=world.m_bodyList; bb; bb=bb.m_next){if (bb.m_userData is Sprite){bb.m_userData.x=bb.GetPosition().x * 30;//這里獲取的變量單位是米,乘以30轉換成像素單位bb.m_userData.y=bb.GetPosition().y * 30;bb.m_userData.rotation=bb.GetAngle() * (180 / Math.PI);}}
}

  好了,現在相信大家已經對Box2D有了一定了解,趕快嘗試制作一些效果吧。

  本文出自動力男孩博客:http://www.p-boy.cn/?p=473

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/2/151813.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息