導航:首頁 > 物理學科 > unity如何實現物理抓取

unity如何實現物理抓取

發布時間:2022-12-24 17:45:47

A. (六)Unity3D物理引擎組件匯總

首先要熟悉一些基本的力學名詞及相關公式

剛體(Rigidbody) :剛體是指在運動中和受到力的作用後,形狀和大小不變,而且內部各點的相對位置不變的物體。絕對剛體實際上是不存在的,剛體是力學中的一個科學抽象概念,即理想模型。
力(F) :力是物體對物體的作用,力不能脫離物體而單獨存在。Unity的物理引擎就是以此為基礎構建的。
重力(G) :物體由於地球的吸引而受到的力叫重力。重力的施力物體是地心。Unity中的重力與其相似。重力的方向總是豎直向下。
摩擦力 :在Unity中分為滑動摩擦力和靜摩擦力。通常通過設置動摩擦系數和靜摩擦系數來控制物體的運動。(滾動摩擦一般不用)
彈力 :在Unity中物體受外力後產生與其相反方向的力。通常通過設置彈性系數來
使物體獲得彈性屬性。
扭矩力 :使物體發生轉動的力。
阻尼 :當物體受到外力作用而振動時,會產生一種使外力衰減的反力,稱為阻尼力(或減震力) 。

重力加速度 (單位:m/s^2): g = 9.81 (在Unity中)
重力 (單位:N): G = mg ***
滑動摩擦力
(單位:N): F = μ×FN (FN:正壓力,μ:動摩擦因數)
單擺周期公式
(單位:s): T = 2π√(L/g)***(L:擺長)
力矩 (單位:N×m): M = FL (L:擺動軸)

物體要受力的影響就需要添加Rigibody組件。(基本上能動的物體都需要Rigibody組件)物體添加Rigibody組件後,可以接受外力和扭矩力,並一直受到重力影響,

選中一個物體後,為其添加Rigibody組件。

Mass(質量) :用於設置游戲對象的質量。(一般在同一游戲場景中,游戲對象之間的質量差不大於100倍)
Drag(阻力) :即游戲對象受力運動時受到的空氣阻力,阻力極大時,游戲對象會立即停止運動。
Angular Drag(角阻力) :即游戲對象受扭矩力旋轉時受到的空氣阻力。同樣的,阻力極大時,游戲對象會立即停止旋轉。
Use Gravity(使用重力) :即開啟此項時,游戲對象會受到重力的影響。
Is Kinematic(是否開啟動力學) :即開啟此項時,游戲對象將不再受到物理引擎的影響,從而只能通過Transform屬性來對其操作。(該方式適用於模擬平台的移動或帶有鉸鏈關節鏈接剛體的動畫)
Interpolate(插值) :用於控制剛體運動的抖動情況。
None:沒有插值。
Interpolate:內插值。基於前一幀的Transform平滑此次的Transform。
Extrapolate:外插值。基於下一幀的Transform平滑此次的Transform。
Collision Detection(碰撞檢測) :該屬性用於控制避免高速運動的游戲對象穿過其它對象而未發生碰撞。
Discrete:離散碰撞檢測。該模式與場景中其它的所有碰撞體進行碰撞檢測。該值為默認值。
Continuous:連續碰撞檢測。該模式用於檢測與動態碰撞體(帶有Rigidbody)碰撞,使用連續碰撞檢測模式來檢測與網格碰撞體的(不帶Rigidbody)碰撞。其它的剛體會採用離散碰撞模式。此模式適用於那些需要採用連續動態碰撞檢測的對象相碰撞的對象。這對物理性能會有很大的影響,如果不需要對快速運動的對象進行碰撞檢測,不建議使用此模式,建議使用離散碰撞檢測模式。
Continuous Dynamic:連續動態碰撞檢測。該模式用於檢測與採用連續碰撞模式或連續動態碰撞模式對象的碰撞,也可以用於檢測沒有Rigidbody的靜態網格碰撞體。對於與之碰撞的其它對象可採用離散碰撞檢測。該模式也可以用於檢測快速運動的游戲對象。
Constraints(約束) :該項用於控制對於剛體運動的約束。
Freeze Position:凍結位置。剛體對象在世界坐標系中的x,y,z軸方向上(選中狀態)的移動將無效。
Freeze Rotation:凍結旋轉。剛體對象在世界坐標系中的x,y,z軸方向上(選中狀態)的旋轉將無效。

Constant Force用來為剛體添加恆力。適用於類似火箭發射的對象,因為F=ma,使得這類對象的速度不斷提升。

選中一個物體後,為其添加Constant Force組件。

四種屬性均用三維向量表示,坐標軸表示方向,數值表示大小。

需要注意的是:添加恆力(Constant Force)組件時,系統會默認添加剛體(Rigidbody)組件。

添加恆力組件後,不能移除剛體組件。

Force(力) :設置世界坐標系中使用的扭矩力。
Relative Force(相對力) :設置在物體局部坐標系中使用的力。
Torque(扭矩) :設置在世界坐標系中使用的扭矩力。游戲對象依據該向量進行轉動。(向量越長轉動越快)
Relative Torque(相對扭矩) :相對扭矩。設置在物體局部坐標系中使用的扭矩力。。游戲對象依據該向量進行轉動。(向量越長轉動越快)

Character Controller主要用於第三人稱或第一人稱游戲主角的控制。不使用剛體物理效果。(Character Controller可通過物理效果影響其他的對象,但無法通過物理效果被其他的對象影響)

選中一個物體後,為其添加Character Controller組件。

Slope Limit(坡度限制) :設置所控制的游戲對象只能爬上角度小於或等於該參數值的斜坡傾角。

Step Offset(台階高度) :設置所控制的游戲對象可以邁上的最高台階的高度。

Skin Width(皮膚厚度) :該參數決定了兩個碰撞體可以相互參入的深度。
較大的參數值會產生抖動的現象,較小的參數值會導致所控制的游戲對象被卡住,較為合理的設置是該參數值為Radius值的10%。

Min Move Distance(最小移動距離) :如果所控制的游戲對象的移動距離小於該值,則游戲對象將不會移動,這樣可避免抖動,大多數情況下將該值設為0。

Center(中心) :該參數決定了膠囊碰撞體與所控制的游戲對象的相對位置,並不影響所控制的角色對象的中心坐標

Radius(半徑) :膠囊體碰撞的長度半徑,同時該項也決定了碰撞體的半徑。

Height(高度) :用於設置所控制的角色對象的膠囊體碰撞體的高度。

Collider要與Rigibody一起添加到游戲對象上才能觸發碰撞。
兩個剛體撞在一起時,擁有碰撞體的對象才會計算碰撞。
都沒有碰撞體的兩個剛體會彼此穿過,不會發生碰撞。

添加Collider組件方法

一般創建一個游戲對象時會自動添加相應的碰撞體。

該碰撞體可調整為不同大小的長方體。
可用作門、牆、平台,也可用於布娃娃的角色軀干或汽車等交通工具的外殼上。

該碰撞體的三維大小可以均勻地調節,但不能單獨調節某個坐標軸方向的大小。
可用作落石、球類等游戲對象。

該碰撞體的高度和半徑可單獨調節。
可用作角色控制器或與其他不規則形狀的碰撞結合使用。(Uinty中角色控制器中通常內嵌了膠囊碰撞體)

該碰撞體通過獲取網格對象並在其基礎上構建碰撞。
與在復雜的網路模型上使用基本碰撞體相比,網格碰撞體要更加精細,但會佔用更多的系統資源。(開啟Convex參數的網格碰撞體才可以與其他的網格碰撞體發生碰撞)

該碰撞體是基於地形構建的碰撞體。

車輪碰撞體是一種針對地面車輛的特殊碰撞體,它有內置的碰撞檢測、車輪物理系統及有滑胎摩擦的參考體。
除了車輪,該碰撞體也可用於其他的游戲對象。

關節是模擬物體與物體之間的一種連接關系,關節必須依賴於剛體組件。
關節組件可以添加到多個游戲對象中,關節又分為3D類型的關節和2D類型的關節。(本篇講述3D關節)

添加Joint組件方法

由兩個剛體組成,使它們像被連接在一個鉸鏈上那樣運動。
它非常適用於對門的模擬,也可用作模型鏈及鍾擺等物體。

需要注意的是:添加關節(Join)組件時,系統會默認添加剛體(Rigidbody)組件。

添加關節組件後,不能移除剛體組件。

Connected Body(連接剛體) :為關節指定要連接的剛體。(若不指定剛體,則該關節默認與世界相連)

Anchor(錨點) :剛體可圍繞錨點進行擺動。該值應用於局部坐標系。

Axis(軸) :定義剛體擺動的方向。該值應用於局部坐標系。

Auto Configure Connected Anchor(自動設置連接錨點) :勾選該項,連接錨點會自動設置。(該項默認為開啟狀態)

Connected Anchor(連接錨點) :自動連接錨點項開啟時,此項會自動設置。自動連接錨點項未開啟時,可手動設置連接錨點。

Use Spring(使用彈簧) :勾選該項,彈簧會使剛體與其連接的主體形成一個特定的角度

Spring(彈簧) :當Use Spring參數開啟時,此屬性有效。

Spring:彈簧力。設置推動對象使其移動到相應位置的作用力。

Damper:阻尼。設置對象的阻尼值,數值越大則對象移動得越緩慢。

Target Position:目標角度。設置彈簧的目標角度,彈簧會拉向此角度。

Use Motor(使用發動機) :勾選該項,發動機會使對象發生旋轉。

Motor(發動機) :當Use Motor參數開啟時,此屬性有效。

Target Velocity:目標速度。設置對象預期將要達到的速度值。

Force:作用力。設置為了達到目的速度而施加的作用力。

Free Spin:自動轉動。勾選該項,則發動機永遠不會停止,旋轉只會越轉越快。

Use Limits(使用限制) :勾選該項,鉸鏈的角度將被限定在最大值和最小值之間。

Limits(限制) :當Use Limits參數開啟時,此屬性有效。

Min:最小值。設置鉸鏈能達到的最小角度。

Max:最大值。設置鉸鏈能達到的最大角度。

Min Bounce:最小反彈。設置當對象觸到最小限制時的反彈值。

Max Bounce:最大反彈。設置當對象觸到最大限制時的反彈值。

Contact Distance:接觸距離。控制關節的抖動。

Break Force(斷開力) :設置鉸鏈關節斷開的作用力。

Break Torque(斷開轉矩) :設置斷開鉸鏈關節所需的轉矩。

Enable Collision(激活碰撞) :勾選該項,關節之間也會檢測碰撞。

Enable Preprocessing(啟用預處理) :勾選該項,實現關節的穩定。(該項默認為開啟狀態)

固定關節用於約束一個游戲對象對另一個游戲對象的運動。類似於對象的父子關系,但它是通過物理系統來實現而不像父子關系那樣是通過Transform屬性來進行約束。(使用固定關節的對象自身需要有一個剛體組件)
適用於當希望將對象較容易與另一個對象分開時,或者連接兩個沒有父子關系的對象使其一起運動時。

Connected Body (連接剛體) :用於指定關節要連接的剛體。(若不指定剛體,則該關節默認與世界相連)

Break Force(斷開力) :設置關節斷開的作用力。

Break Torque(斷開轉矩) :設置斷開關節所需的轉矩。

Enable Collision(激活碰撞) :勾選此項,則關節之間也會檢測碰撞。

Enable Preprocessing(啟用預處理) :勾選該項,實現關節的穩定。(該項默認為開啟狀態)

彈簧關節組件可將兩個剛體連接在一起,使其像連接著彈簧那樣運動。

Connected Body(連接剛體) :用於為彈簧指定要連接的剛體。(若不指定剛體,則該關節默認與世界相連)

Anchor(錨點) :設置Joint在對象局部坐標系中的位置。(注意:不是對象將彈向的點)

Auto Configure Connected Anchor(自動設置連接錨點) :勾選該項,連接錨點會自動設置。(該項默認為開啟狀態)

Connected Anchor(連接錨點) :自動連接錨點項開啟時,此項會自動設置。自動連接錨點項未開啟時,可手動設置連接錨點。

Spring(彈簧) :設置彈簧的強度,數值越高彈簧的強度就越大。

Damper(阻尼) :設置彈簧的阻尼系數,阻尼數值越大,彈簧強度減小的幅度越大。

Min Distance(最小距離) :設置彈簧啟用的最小距離值。如果兩個對象之間的當前距離與初始距離的差小於該值,則不會開啟彈簧。

Max Distance(最大距離) :設置彈簧啟用的最小距離值。如果兩個對象之間的當前距離與初始距離的差大於該值,則不會開啟彈簧。

Break Force(斷開力) :設置彈簧關節斷開所需的作用力。

Break Torque(斷開轉矩) :設置彈簧關節斷開所需的轉矩力。

Enable Collision(激活碰撞) :勾選該項,關節之間也會檢測碰撞。

Enable Preprocessing(啟用預處理) :勾選該項,實現關節的穩定。(該項默認為開啟狀態)

角色關節主要用於表現布娃娃效果,它是擴展的球關節,可用於限制關節在不同旋轉軸下的旋轉角度。

Connected Body(連接剛體) :用於為角色關節指定要連接的剛體。(若不指定剛體,則該關節默認與世界相連)

Anchor(錨點) :設置游戲對象局部坐標系中的點,角色關節將按圍繞該點進行旋轉。

Axis(扭動軸) :設置角色關節的扭動軸。(以橙色的圓錐gizmo表示)

Auto Configure Connected Anchor(自動設置連接錨點) :勾選該項,連接錨點會自動設置。(該項默認為開啟狀態)

Connected Anchor(連接錨點) :自動連接錨點項開啟時,此項會自動設置。自動連接錨點項未開啟時,可手動設置連接錨點。

Swing Axis(擺動軸) :設置角色關節的擺動軸。(以綠色的圓錐gizmo表示)

Twist Limit Spring(彈簧的扭曲限制)

Spring:設置角色關節扭曲的彈簧強度。

Damper:設置角色關節扭曲的阻尼值。

Low Twist Limit(扭曲下限) :設置角色關節扭曲的下限。

Limit:設置角色關節扭曲的下限值。

Bounciness:設置角色關節扭曲下限的反彈值。

Contact Distance:設置用於為了避免抖動而限制的接觸距離。

High Twist Limit(扭曲上限) :設置角色關節扭曲的上限。

Limit:設置角色關節扭曲的上限值。

Bounciness:設置角色關節扭曲上限的反彈值。

Contact Distance:設置用於為了避免抖動而限制的接觸距離。

Swing Limit Spring(彈簧的擺動限制)
Spring:設置角色關節擺動的彈簧強度。
Damper:設置角色關節擺動的阻尼值。

Swing 1,2 Limit(擺動限制1,2) :1與2的限制是對稱的,即更改一個裡面的三項屬性即可。

Limit:設置角色關節擺動的限制值。

Bounciness:設置角色關節擺動限制的反彈值。

Contact Distance:設置用於為了避免抖動而限制的接觸距離。

Enable Projection(啟動投影) :該項用於激活投影。

Projection Distance(投影距離) :設置當對象與其連接剛體的距離超過投影距離時,該對象會回到適當的位置。

Projection Angle(投影角度) :設置當對象與其連接剛體的角度超過投影角度時,該對象會回到適當的位置。

Break Force(斷開力) :控制角色關節斷開所需的作用力。

Break Torque(斷開轉矩) :設置角色關節斷開所需的轉矩。

Enable Collision(激活碰撞) :勾選該項,則關節之間也會檢測碰撞。

Enable Preprocessing(啟用預處理) :勾選該項,實現關節的穩定。(該項默認為開啟狀態)

可配置關節組件支持用戶自定義關節,它開放了PhysX引擎中所有與關節相關的屬性,因此可像其他類型的關節那樣來創造各種行為。
可配置關節有兩類主要的功能:移動/旋轉限制和移動/旋轉加速度。

connected boby(連接剛體) :用於為關節指定要連接的剛體。(若不指定則該關節將與世界相連接)

anchor(錨點) :設置關節的中心點,所有基於物理效果的模擬都會以此點為中心點來進行計算。

axis(主軸) :設置局部旋轉軸,該軸決定了對象在物理模擬下自然旋轉的方向。

Auto Configure Connected Anchor(自動設置連接錨點) :勾選該項,連接錨點會自動設置。(該項默認為開啟狀態)

Connected Anchor(連接錨點) :自動連接錨點項開啟時,此項會自動設置。自動連接錨點項未開啟時,可手動設置連接錨點。

Secondary Axis(副軸) :主軸和副軸共同決定了關節的局部坐標。第三個軸與這兩個軸所構成的平面相垂直。

Xmotion(X軸移動) :設置游戲對象在X軸的移動形式,有自由移動(Free)、鎖定移動(Locked)及限制性移動(Limited)。

Ymotion(Y軸移動) :設置游戲對象在Y軸的移動形式,有自由移動(Free)、鎖定移動(Locked)及限制性移動(Limited)。

Zmotion(Z軸移動) :設置游戲對象在Z軸的移動形式,有自由移動(Free)、鎖定移動(Locked)及限制性移動(Limited)。

Angular Xmotion(X軸旋轉) :設置游戲對象圍繞X軸的旋轉形式,有自由旋轉(Free)、鎖定旋轉(Locked)及限制性旋轉(Limited)。

Angular Ymotion(Y軸旋轉) :設置游戲對象圍繞Y軸的旋轉形式,有自由旋轉(Free)、鎖定旋轉(Locked)及限制性旋轉(Limited)。

Angular Zmotion(Z軸旋轉) :設置游戲對象圍繞Z軸的旋轉形式,有自由旋轉(Free)、鎖定旋轉(Locked)及限制性旋轉(Limited)。

Linear Limit Spring(彈簧線性限制)
Spring:彈簧。設置將對象拉回邊界的力。
Damper:阻尼。設置彈簧的阻尼值。

Linear Limit(線性限制) :設置自關節原點的距離為基準對其運動邊界加以限定。

Limit:限制。設置從原點到邊界的距離。

Boundciness:反彈。設置當對象到邊界時施加給它的反彈力。

Contact Distance:設置用於為了避免抖動而限制的接觸距離。

Angular X Limit Spring(X軸旋轉限制)

Spring:彈簧。設置將對象拉回邊界的力。

Damper:阻尼。設置彈簧的阻尼值。

Low Angular X Limit(X軸旋轉下限) :以與關節初始旋轉的差值為基礎設置旋轉約束下限的邊界。

Limit:旋轉的限制角度。設置對象旋轉角度的下限值。

Bounciness:反彈。設置當對象到邊界時施加給它的反彈力。

Contact Distance:設置用於為了避免抖動而限制的接觸距離。

High Angular X Limit(X軸旋轉上限) :以與關節初始旋轉的差值為基礎設置旋轉約束上限的邊界。

Limit:旋轉的限制角度。設置對象旋轉角度的上限值。

Bounciness:反彈。設置當對象到邊界時施加給它的反彈力。

Contact Distance:設置用於為了避免抖動而限制的接觸距離。

Angular YZ Limit Spring(Y軸和Z軸旋轉限制)
屬性參數同Angular X Limit Spring

Angular Y Limit (Y軸旋轉限制)*
屬性參數同Angular X Limit

Angular Z Limit (Y軸旋轉限制)*
屬性參數同Angular X Limit

Target Position(目標位置) :關節在X,Y,Z三個軸向上應達到的目標位置。

Target Velocity(目標速度) :關節在X,Y,Z三個軸向上應達到的目標速度。

XDrive(X軸驅動) :設置了對象沿局部坐標系X軸的運動形式。

Position Spring:位置彈簧力。朝預定義方向上的皮筋的拉力。

Position Damper:位置阻尼。抵抗位置彈簧力的力。

Maximum Force:最大作用力。推動對象朝預定方向運動的作用力的總和。

YDrive(Y軸驅動) :設置了對象沿局部坐標系Y軸的運動形式。
屬性參數同XDrive

ZDrive(Z軸驅動) :設置了對象沿局部坐標系Z軸的運動形式。
屬性參數同XDrive

Target Rotation(目標旋轉) :目標旋轉是一個四元數,它定義了關節應當旋轉到的角度。

Target Angular Velocity(目標旋轉角速度) :目標旋轉角速度是一個三維向量,它定義了關節應當旋轉到的角速度。

Rotation Drive Mode (旋轉驅動模式) :通過X&YZ軸驅動或插值驅動來控制對象自身的旋轉。

Angular X Drive (X軸角驅動) :設置了關節如何圍繞X軸進行旋轉。

Position Spring:位置彈簧力。朝預定義方向上的皮筋的拉力。

Position Damper:位置阻尼。抵抗位置彈簧力的力。

Maximum Force:最大作用力。推動對象朝預定方向運動的作用力的總和。

Angular YZ Drive (YZ軸角驅動) :設置了關節如何圍繞自身的Y軸和Z軸進行旋轉。
屬性參數同Angular X Drive

Slerp Drive(差值驅動) :設置了關節如何圍繞局部所有的坐標軸進行旋轉。
屬性參數同Angular X Drive

Projection Mode(投影模式) :設置當對象離開其限定的位置過遠時,會讓該對象回到其受限制的位置。可設置為位置和旋轉(Position and Rotation)以及不選擇(None)。

Projection Distance(投射距離) :設置當對象與其連接剛體的距離超過投影距離時,該對象會回到適當的位置。

Projection Angle(投影角度) :設置當對象與其連接剛體的角度差超過投影角度時,該對象會回到適當的位置。

Configured In World Space(在世界坐標系中配置) :勾選該項,所有與目標相關的數值都會在世界坐標系中來計算,而不在對象的局部坐標系中計算。

Swap Bodies(交換體) :勾選該項,則應用交換剛體功能,連接著的兩個剛體會發生交換。

Break Force(斷開力) :設置控制關節斷開所需的作用力。

Break Torque(斷開轉矩) :設置關節斷開所需的轉矩。

Enable Collision(激活碰撞) :勾選該項,關節之間也會檢測碰撞。

Enable Preprocessing(啟用預處理) :勾選該項,實現關節的穩定。(該項默認為開啟狀態)

B. Unity 物理系列二 AddForce velocity

https://docs.unity3d.com/cn/2019.4/ScriptReference/Rigidbody.AddForce.html
https://docs.unity3d.com/cn/2019.4/ScriptReference/ForceMode.html
Unity中關於作用力方式ForceMode的功能註解

功能註解:ForceMode為枚舉類型,用來控制力的作用方式,有4個枚舉成員,在以下舉例中均設剛體質量為m=2.0f,力向量為f=(10.0f,0.0f,0.0f)。

默認方式,使用剛體的質量計算,以每幀間隔時間為單位計算動量。設FixedUpdate()的執行頻率採用系統默認值(即0.02s),,則由動量定理f•t=m•v可得:10*0.02=2*v1,從而可得v1=0.1,即每幀剛體在X軸上值增加0.1米,從而可計算得剛體的每秒移動速度為v2=(1/0.02)*v1=5m/s。

在此種作用方式下會忽略剛體的實際質量而採用默認值1.0f,時間間隔以系統幀頻間隔計算(默認值為0.02s),即f•t=1.0•v即可得v1= f•t=10*0.02=0.2,即剛體每幀增加0.2米,從而可得剛體的每秒移動速度為v2=(1/0.02)*v1=10m/s。

此種方式採用瞬間力作用方式,即把t的值默認為1,不再採用系統的幀頻間隔,即f•1.0=m•v即可得v1=f/m=10.0/2.0=5.0,即剛體每幀增加5.0米,從而可得剛體每秒的速度為v2=(1/0.02)*5.0=250m/s。

此種作用方式下將忽略剛體的實際質量,採用默認質量1.0,同時也忽略系統的實際幀頻間隔,採用默認間隔1.0,即f•1.0=1.0•v即可得v1=f=10.0,即剛體每幀沿X軸移動距離為10米,從而可得剛體每秒的速度為v2=(1/0.02)*v1=500m/s。

https://docs.unity.cn/cn/2019.4/ScriptReference/Rigidbody-velocity.html
剛體的速度矢量。它表示剛體位置的變化率。

在大多數情況下,不應該直接修改速度,因為這可能導致行為失真 - 改用 AddForce

請勿在每個物理步驟中設置對象的速度,這將導致不真實的物理模擬。 需要更改速度的一個典型用法是第一人稱射擊游戲中的跳躍動作設計,因為此時需要立即更改速度。

酷游戲的一些bug總結(濫用FixedUpdate的坑)
Unity3D中Rigidbody.velocity和Addforce的區別
假設我們想要做一個2D的跳躍游戲,在這個游戲里我希望我按下跳躍鍵的時候,游戲物體的跳躍高度是恆定的。

那麼,如果此時我使用的是addForce顯然不會滿足我的效果,因為經過測試,每按一下跳躍鍵,它會被施加一個恆定的力,它跳躍的初始速度會越變越大,每次跳躍的高度和前一次相較變得越來越大(在連續跳躍的情況下),也就是可以理解成,我現在被施加了一個大小為50的力,在重力作用下我的力的效果在減小,在正向速度還沒有完全消失的情況下,此時我又按了一下跳躍鍵,那麼就會在這個力的基礎上再施加一次大小為50的力,物體會越跳越快,越跳越高。

而此時如果我們使用的是velocity方法 改變它的初始速度到我們希望的值和方向 ,那麼當我們按下跳躍鍵的時候,無論此時物體減速到何種情況,也最多隻會提升到我們規定的速度以及朝向我們規定的方向。初始速度不變的情況下,跳躍高度也是恆定的。

解決:
AddForce之前應該清一下速率,因為是射線檢測是否碰到地面,而跳躍後不會立刻離地。如果不清,後面幾幀會累加AddForce。 清除速率保證離地的一瞬間肯定是正常Force,而非累加Force。

我們常在Unity開發中直接使用Rigidbody.velocity屬性來獲取剛體的當前速度,這在大多數情況下是沒有問題的。但在某些情況下這么做就可能得不到我們想要的結果。比如通過transform.Translate(), transform.RotateAround(), rigidbody.MovePosition(), Vector3.MoveTowards() 等方法 「強制」 改變剛體的運動狀態時,此時物體速度的改變並不會引起Rigidbody.velocity的改變。

而當我們把所有球的剛體組件中的Is Kinematic屬性勾選上後,我們再來看看運行結果:

OMG!【僅移動】小球的Rigidbody.velocity居然又和真實速率一致了!

我並不了解Rigidbody.velocity這個屬性在內部是如何被定義的,官方文檔沒有相關的說明,網上也沒有找到相關的資料,我個人只能根據這些現象做如下的一些推測。

當剛體的Is Kinematic沒有被勾選時,剛體的運動就被Unity的物理引擎所掌控,物體的運動和狀態都會遵循真實世界的物理定律。我們知道,在牛頓力學中,要改變一個物體的運動狀態必須要對其施加力,Unity也為我們提供了AddForce()方法。然而像MovePosition()這樣的方法似乎可以讓物體的運動隨心所欲,能夠以任意速度到達任意位置,可以讓物體瞬間加到一個非常大的速度。顯而易見,這種對運動狀態的 「 強制 」 改變必定不能通過加力的方式實現,這就已經脫離了真實世界的物理定律了。 被物理引擎控制的物體擅自進行了不按套路的操作,Rigidbody.velocity就不會記錄這種 「非法」 操作帶來的速度改變,或者將這種非法操作對velocity的改變視為0。

反之,當剛體的Is Kinematic被勾選時,剛體的運動就脫離了Unity的物理引擎控制。風水輪流轉,天道好輪回,這種情況下MovePosition()成了合法操作,AddForce()成了非法操作了。想要報仇雪恨的MovePosition()積攢了多年的怨氣,對非法操作的限制變得更為嚴格,之前的情況還允許非法操作對物體運動狀態的改變,這次已經完全屏蔽了AddForce()的作用。 從上一張截圖就可看出,這次即便加力物體也始終保持靜止。此時此刻MovePosition()終於作為合法操作被Rigidbody.velocity認可,使其能夠反映物體真實速率。

總結
通過以上案例,我的想法就是最好不要對未勾選Is Kinematic的剛體使用 transform.Translate(), transform.RotateAround(),rigidbody.MovePosition(),Vector3.MoveTowards() 等等這些方法,畢竟這些非常規操作必定會對物理模擬的真實性產生影響。如果你不得不使用時,也請注意Rigidbody.velocity並不是物體在場景和游戲視圖中的真實速度,不要濫用這些方法和這個屬性而不小心掉入它的 「 陷阱 」。

https://docs.unity.cn/cn/2019.4/Manual/class-ConstantForce.html
恆定力 (Constant Force) 可用於快速向 剛體 添加恆定力。如果不希望某些一次性對象以較大的速度開始而是逐漸加速(比如火箭),則很適合使用恆定力。

要製作一個向前加速的火箭,請將 Relative Force 設定為沿正 z 軸。然後,使用剛體的 Drag 屬性使其不超過某個最大速度(阻力越高,最大速度越低)。在剛體中,還要確保關閉重力,以便火箭始終保持在其路徑上。

C. unity3d 主角拾取道具並判定的代碼

Unity3D滑鼠拾取物體可以通過射線的方式獲取滑鼠坐標 通過物理將物體名字輸出進行操作。
function Update ()
{
if (Input.GetMouseButton (0))
{
var ray = Camera.main.ScreenPointToRay (Input.mousePosition);
var hit : RaycastHit;
if (Physics.Raycast (ray, hit))
{
Debug.DrawLine (ray.origin, hit.point);
print(hit.collider.gameObject.name);
}
}
}

D. 如何在unity中實現靠近才能撿東西

可以使用鋼體和碰撞控制項來實現呀!
box collider 碰撞控制項
rigidbody 鋼體控制項
將物件賦予鋼體屬性和碰撞檢測屬性,
當你的人物(或者是啥自己設定)走近此物件,將觸發碰撞檢測,
這里的檢測判斷可以是按鍵還是滑鼠按鍵還是啥都可自行設定,
滿足條件後就觸發,比如放個煙花?或者回血?自行定義了。
以上希望可以幫助到你。

E. Unity抓取相機截圖/抓取屏幕截圖

在項目中,我們會遇到需要抓取相機截圖,然後作為UI背景的需求。一般的思路如下:

處理將該渲染紋理作為UI背景,我們還可以充分利用該紋理做一些屏幕後處理特效加工。

與相機截圖不一樣的是,該屏幕截圖會抓取所有渲染之後的結果(包含所有相機、UI渲染結果),相當於在手機上直接截圖屏幕。

由於該截圖需要獲取到所有渲染,所以我們需要在所有渲染完畢後調用方法,因此會利用到攜程的 WaitForEndOfFrame 對象。

這里我們用到的是 Texture2D ReadPixels() 方法來採集渲染信息,而沒有採用 RenderTexture ,有需要的話可以使用 Graphics.Blit(Texture source, RenderTexture dest); 將源紋理復制到目標渲染紋理中。

F. Unity的Joint到底怎樣實現被繩子牽起來的物理效果

cube 上的鉸鏈 joint

G. Unity3d在場景中如何選取物體

在角色上增加一個任意種類的collider,如果已經有了就不需要
第一種方法,在角色上寫一個檢測代碼
class SelectChecker:MonoBehaviour
{
void OnMouseDown()
{

Debug.Log("OnMouseDown");

}
}
將該腳本拖到角色上即可。當點擊一個角色時,輸出OnMouseDown。這種是被動的方法
還有一個是主動的,需要通過物理射線檢測來做,主要用到的函數為
Physics.RayCast方法,先將滑鼠位置轉化為射線,然後物理測試,代碼片段如下
Class SelectChecker2:MonoBehaviour
{
void Update()
{
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit hit;
if (Physics.Raycast(ray, out hit, 100))

{
//hit.collider.gameobject就是滑鼠點中的物體

}
}
}
將該腳本放在任意一個gameobject上即可
以上代碼純手打,思路完全沒有問題,但可能有個別語法或者拼寫錯誤,請自行修正

H. 如何讓unity中物理效果更加逼真

如何讓unity中物理效果更加逼真
物理可能不是每個人最喜歡的那個科目,但事實是,物理學在游戲行業的發展中起著非常重要的作用。
想像在這樣一個情況下:你終於決定要做一些大事情!一些值得注意的事情!有很多現實物理和圖形的大事情!這是一個大游戲,一切都岌岌可危!
設計已經完成了,架構也已經弄好了,看上去一切就緒。但是這時候你開始實現最有技巧的那個部分:」游戲的物理部分」!
一切都開始分崩離析,你遇到了低FPS、奇怪的運動、碰撞/觸發方面的問題,CPU使用率很高以及其他各種各樣的問題。
錯誤或不適當的物理表現可以趕走潛在的玩家。而且它涉及的不僅僅是物理表現的不正確,它還會讓一個原本流暢的游戲體驗變得延遲不舒服。
讓物理部分表現的很恰當而且不影響效率是不容易達到的。的確,物理是游戲開發過程中最困難和最重要的一部分,而且你根本避不開,必須面對它!
人們可以爭論說,「好的物理表現需要非常快的CPU!」
但是相信我這並不總是真的!大多數時候可以通過深入分析Unity的原理來獲得適當的物理表現!以及通過學習它是如何工作的來讓物理部分表現的更好。
當我還是一個初學者的時候,我不得不處理100件和物理部分有關的事情。它大概花費了我一年的時間,我才記下在處理物理部分的時候需要記住的要點!
所以我決定寫這篇文章,來幫你跳過這個痛苦的學習階段,並成為游戲物理部分的專業開發人員!
我不會談論如何使用Unity的物理部分,而我將列出技巧和要點來告訴你該如何優化你的游戲物理部分,所以如果你是一個初學者的話,我會建議你首先對Unity的物理部分有一個大概的了解。
因為物理是一個非常、非常、非常、非常(還可以有很多非常進行修飾:P)巨大而廣泛的概念,我決定分成幾個不同的部分和並盡可能的簡化。
所以讓我們開始吧!系好你的安全帶,這將是一個漫長而愉快的旅程。
降低固定的更新時間間隔。。。!
Unity的文檔是這么描述的,」物理部分的計算與更新是與幀速率無關的,FixedUpdate()時間也是與與幀速率無關的」。這個默認值是0.02(單位是秒),這意味著每20毫秒物理部分將要更新一次。所有的FixedUpdate() 函數也是20毫秒執行一次。
但是如果你的游戲不是嚴重依賴物理部分的話,你總是可以增加時間間隔,從而獲得更好的結果。(即減少物理部分的調用)。
你需要對這個值進行測試調整來得到理想的效果。
讓我們舉個簡單的例子:
「如果你要做一個簡單的紙牌游戲,沒有太多使用物理的地方。最好是減少調用物理引擎的次數。但是需要記住這么一個事情:如果你把調用物理引擎的次數減少的太多的話,你可能不會得到恰當的物理表現。」
讓我們通過下面這些例子來更好的理解這個事情
1在場景中擺放3- 4球。讓他們彼此相隔一定距離。
2創建一個物理材料,並將摩擦系數減少為0,並將反彈系數設為1。
3將新創建的物理材質附加到球體的碰撞體物理材質上。
4給球體添加剛體組件(這將向引擎表明它是一個物理物體)。
5在場景中擺放一個平面,並且按需要來給這個平面添加物理材質。
6讓球體保持在平面上的一定距離,並且讓重力影響這些球體。
7按下播放鍵,檢查結果。
這些球體會不停的彈上彈下。
這與固定時間步長有什麼關系?
上面這些只是一些預設置,現在我們來調整下固定的時間步長值。
在菜單欄裡面找到Edit >> Project Settings>> Time ,在這里你將看到Fixed Time Step Value:the value will be around 0.02(正如我之前提到的那樣)。
現在把這個值提為0.1,然後再執行游戲。
你注意到區別是什麼了么?
首先你會注意到球體有一些運動滯後。
其次,球體不會反彈了,而是直接穿過了平面。
為什麼會這樣?(不需要跳動的如此之快:P)
如果你把固定時間步長設置為0.1,那麼這意味著物理部分的更新將每100毫秒發生一次,這很明顯的有點過長了,並且將無法將測到碰撞。
這表明過多的降低固定時間步長也不是個很理想的情況。現在讓我們改變時間步長為更實用的值0.03 - 0.04(根據你的球體的設置可能會有所不同)。
現在如果你執行游戲的話,你將無法看到任何變化。只要物理看起來適合你,那就沒關系。如果你仔細檢查的話,物理碰撞會略有不同。

I. 如何使用unity3d製作出真實的物理效果

給物體添加物理特性即可,在屬性裡面,使其具有碰撞,重力等物理性質

閱讀全文

與unity如何實現物理抓取相關的資料

熱點內容
word中化學式的數字怎麼打出來 瀏覽:739
乙酸乙酯化學式怎麼算 瀏覽:1404
沈陽初中的數學是什麼版本的 瀏覽:1350
華為手機家人共享如何查看地理位置 瀏覽:1042
一氧化碳還原氧化鋁化學方程式怎麼配平 瀏覽:884
數學c什麼意思是什麼意思是什麼 瀏覽:1408
中考初中地理如何補 瀏覽:1299
360瀏覽器歷史在哪裡下載迅雷下載 瀏覽:701
數學奧數卡怎麼辦 瀏覽:1387
如何回答地理是什麼 瀏覽:1023
win7如何刪除電腦文件瀏覽歷史 瀏覽:1055
大學物理實驗干什麼用的到 瀏覽:1484
二年級上冊數學框框怎麼填 瀏覽:1699
西安瑞禧生物科技有限公司怎麼樣 瀏覽:969
武大的分析化學怎麼樣 瀏覽:1247
ige電化學發光偏高怎麼辦 瀏覽:1337
學而思初中英語和語文怎麼樣 瀏覽:1650
下列哪個水飛薊素化學結構 瀏覽:1423
化學理學哪些專業好 瀏覽:1486
數學中的棱的意思是什麼 瀏覽:1057