1. unity 怎麼控制camera可視范圍
代碼控制的話,
透視相機
Camera.main.fieldOfView = 40;
Camera.main.farClipPlane = 500;
垂直相機
Camera.main.orthographicSize = 1;
2. unity 3d 場景中如何隨著攝像機的移動在攝像機周圍一定范圍內是精模超過范圍就切換成簡模呢
不知道你說的范圍是指在視野內還是指在離攝像機一定距離內,在視野范圍內你可以查看OnWillRenderObject這個函數,在網路也有教程判斷視野范圍內,距離的話,用Vector3.Distance計算就可以了.模型的切換也有幾種方法:1.先Destroy掉之前的模型,再Resource.Load新的模型,這種方法不佔內存,占線程,需要處理,或許會卡一下.2把兩個模型都擺在一起,切換模型時,改active(或者renderer.enabled)來隱藏和顯示,這種方法佔內存,但不佔線程,不會卡,具體的看你的需求
3. 怎麼樣使用Unity相機確定AI代理的視線范圍,求大夥幫忙
我的想法是為每一個智能代理,viewsensor綁定一個camera。相機的設置有一定的視野,和遠平面。Unity有兩個用於相機測試的很方便的方法,第一個返回6個截面來定義的攝像頭截(camera frustum),第二個告訴一個邊界對象是在攝像頭截的內部還是外部。
現在我們可以知道一個gameobjet是否在我們的觀圖內,但不是我們是否可以看到它,因為它可能會被另一個更接近攝影機位置的對象遮擋。所以我使用linecasts告知我們是否可以看到這個對象。但我應該轉換哪個位置?對象的中心位置是一個很好的選擇,但不一定足夠准確。我使用對象網格邊界,並遍歷了所有的邊界位置,當linecast不經過任何東西時停止,然後我知道是否可以看到對象。
最完美的方式是為網格的每個頂點之間做一個linecast,但它將花費太多的時間。
獲取所有GameObjects
現在我們有一個函數告訴我們一個特定的對象是否在人工智慧的視線內,我只是測試每個對象,由一個相機位置為原點,以相機遠平面的距離為半徑進行重疊范圍檢查。我為每個對象調用之前的SeeGameObject函數並將在視線內的對象保存在一個數組中。
public bool SeeGameObject(GameObject go)
{
// if object has a renderer and visible by any camera and is in this camera frustum
if(go.renderer != null && go.renderer.isVisible && GeometryUtility.TestPlanesAABB(GeometryUtility.CalculateFrustumPlanes(_camera), go.renderer.bounds))
{
RaycastHit hitInfo;
// by default we use the rough renderer bounds
Vector3 center = go.renderer.bounds.center;
Vector3 extents = go.renderer.bounds.extents;
float coefrec = 0.8f;
Vector3[] gobounds; // points to check for linecast from camera
MeshFilter meshfilter = go.GetComponent<MeshFilter>();
if(meshfilter != null) // Almost every interesting game object that is render has a mesh
{
center = go.transform.position;
extents = meshfilter.mesh.bounds.extents;
extents.Scale(go.transform.lossyScale);
gobounds = new Vector3[33]{ // We can add more or remove some, it increase precision for not too much time or memory cost
Vector3.zero,
go.transform.TransformDirection(new Vector3(extents.x,extents.y,extents.z)*0.9f),
go.transform.TransformDirection(new Vector3(extents.x,extents.y,-extents.z)*0.9f),
go.transform.TransformDirection(new Vector3(extents.x,-extents.y,extents.z)*0.9f),
go.transform.TransformDirection(new Vector3(extents.x,-extents.y,-extents.z)*0.9f),
go.transform.TransformDirection(new Vector3(-extents.x,extents.y,extents.z)*0.9f),
go.transform.TransformDirection(new Vector3(-extents.x,extents.y,-extents.z)*0.9f),
go.transform.TransformDirection(new Vector3(-extents.x,-extents.y,extents.z)*0.9f),
go.transform.TransformDirection(new Vector3(-extents.x,-extents.y,-extents.z)*0.9f),
go.transform.TransformDirection(new Vector3(extents.x,extents.y,extents.z)*0.5f),
go.transform.TransformDirection(new Vector3(extents.x,extents.y,-extents.z)*0.5f),
go.transform.TransformDirection(new Vector3(extents.x,-extents.y,extents.z)*0.5f),
go.transform.TransformDirection(new Vector3(extents.x,-extents.y,-extents.z)*0.5f),
go.transform.TransformDirection(new Vector3(-extents.x,extents.y,extents.z)*0.5f),
go.transform.TransformDirection(new Vector3(-extents.x,extents.y,-extents.z)*0.5f),
go.transform.TransformDirection(new Vector3(-extents.x,-extents.y,extents.z)*0.5f),
go.transform.TransformDirection(new Vector3(-extents.x,-extents.y,-extents.z)*0.5f),
go.transform.TransformDirection(new Vector3(extents.x,extents.y,extents.z)*0.75f),
go.transform.TransformDirection(new Vector3(extents.x,extents.y,-extents.z)*0.75f),
go.transform.TransformDirection(new Vector3(extents.x,-extents.y,extents.z)*0.75f),
go.transform.TransformDirection(new Vector3(extents.x,-extents.y,-extents.z)*0.75f),
go.transform.TransformDirection(new Vector3(-extents.x,extents.y,extents.z)*0.75f),
go.transform.TransformDirection(new Vector3(-extents.x,extents.y,-extents.z)*0.75f),
go.transform.TransformDirection(new Vector3(-extents.x,-extents.y,extents.z)*0.75f),
go.transform.TransformDirection(new Vector3(-extents.x,-extents.y,-extents.z)*0.75f),
go.transform.TransformDirection(new Vector3(extents.x,extents.y,extents.z)*0.25f),
go.transform.TransformDirection(new Vector3(extents.x,extents.y,-extents.z)*0.25f),
go.transform.TransformDirection(new Vector3(extents.x,-extents.y,extents.z)*0.25f),
go.transform.TransformDirection(new Vector3(extents.x,-extents.y,-extents.z)*0.25f),
go.transform.TransformDirection(new Vector3(-extents.x,extents.y,extents.z)*0.25f),
go.transform.TransformDirection(new Vector3(-extents.x,extents.y,-extents.z)*0.25f),
go.transform.TransformDirection(new Vector3(-extents.x,-extents.y,extents.z)*0.25f),
go.transform.TransformDirection(new Vector3(-extents.x,-extents.y,-extents.z)*0.25f)
};
}
else // Only if gameobject has no mesh (= almost never) (Very approximately checking points using the renderer bounds and not the mesh bounds)
{
gobounds = new Vector3[9]{
Vector3.zero,
new Vector3(extents.x,extents.y,extents.z)*coefrec,
new Vector3(extents.x,extents.y,-extents.z)*coefrec,
new Vector3(extents.x,-extents.y,extents.z)*coefrec,
new Vector3(extents.x,-extents.y,-extents.z)*coefrec,
new Vector3(-extents.x,extents.y,extents.z)*coefrec,
new Vector3(-extents.x,extents.y,-extents.z)*coefrec,
new Vector3(-extents.x,-extents.y,extents.z)*coefrec,
new Vector3(-extents.x,-extents.y,-extents.z)*coefrec
};
}
foreach(Vector3 v in gobounds)
{
// test if it can see gameobject
if(GeometryUtility.TestPlanesAABB(GeometryUtility.CalculateFrustumPlanes(_camera), new Bounds(v+center, Vector3.zero)) // if point in viewing frustrum
&& (!Physics.Linecast(transform.position, v+center, out hitInfo) || hitInfo.collider.gameObject == go )) // if nothing between viewing position and point
{
if(graphicalDebug)
{
Debug.DrawLine(transform.position, v+center,Color.red, 0.01f, false);
}
return true;
}
}
}
return false;
}
如果你還有什麼不懂的,可以網路搜下:編程回憶錄,他們現在正在錄制這方面的教程,都是零基礎開始,由淺入深。
4. unity代碼設置虛擬相機參數
CinemachineBrain組件
相當於虛擬相機的總管理。
在這里插入圖片描述
參數介紹:
Live Camera:當前顯示的相機
Live Blend:過度相機時顯示進度
Show Debug Text:在Game視窗里顯示當前使用的相機
在這里插入圖片描述
Show Camera Frustum:顯示視錐
Ignore Time Scale:是否受TimeScale影響
World Up Override:自己設置覆蓋Y軸防止萬向節死鎖。
Update Method:Update方法,選擇默認的SmartUpdate即可。
Blend Update Method:相機混合時的Update方法。
Default Blend:混合時的曲線,比如線性或者Ease之類,也可以自定義。
Custom Blends:自定義混合方案。
Events:虛擬攝像機激活時將觸發此事件。如果涉及混合,則事件在混合的第一幀時觸發。
2.2D虛擬相機
通過選擇菜單欄中的Cinemachine可以創建我們需要的虛擬相機。(注意相機要改為Orthographic)
參數介紹
Status Live:勾選solo意味只使用這一個相機。
Game Windows Guides:是否在游戲視窗顯示線框
在這里插入圖片描述
Save During Play:勾選後可以在運行時保存組件的修改。
Priority:根據數值大小決定優先顯示哪個相機,越大的優先順序越高
Follow:相機跟隨目標
Look At:看向目標,相機不動(2D基本不用,大多數用Follow)
Mode Override:相機模式選擇
Ortho Filed:Orthographic模式下視野大小
Dutch:z軸旋轉
Damping相關(阻尼):鏡頭緩動效果
ScreenX和ScreenY:鏡頭偏移
Dead Zone(死區):死區內鏡頭不會一直跟隨。
Soft Zone(軟區):在軟區內鏡頭會緩慢跟隨目標。超出軟區相機會瞬移跟隨。
Unlimited Soft Zone:不限制軟區(去除紅色部分)
下圖中黑色部分為死區,藍色部分為軟區,超出紅色會瞬移。
在這里插入圖片描述
Lookahead Time:如果設置的話跟隨目標點就會朝移動方向偏移,這樣做比如在2D游戲中就可以看到更前面的視野。
Lookahead Smoothing:平滑值。
Lookahead Ignore Y:忽略Y軸影響。(2D游戲經常勾選,不然可能會導致鏡頭不穩)
黃點就是設置了Lookahead後所帶來的偏移。
在這里插入圖片描述
我們可以通過選擇Extensions->AddExtension->CinemachineConfiner來為虛擬相機添加限制。
在這里插入圖片描述
在這里插入圖片描述
有兩種方式,一種是新建一個空物體添加PolygonCollider2D組建調整好大小賦值過來。另一種如下圖。
在這里插入圖片描述
關於虛擬相機之間的切換我們常用的有兩種,一種是設置Priority,會顯示優先順序高的。另一種是優先顯示激活狀態的相機,可以通過激活失活虛擬相機進行顯示切換。
5. 【Unity3D】unity3d攝像機角度怎麼調整
Unity中 有兩個類型的相機
首先是觀看Scene面板的相機,這個相機只有一個,而且 使用者無法看到本體,該相機用於Scene面板的顯示,在面板上 點擊滑鼠左中右拖動 和滾輪 以及一些快捷鍵可以進行控制,打包後,顯示內容並非此相機控制,該界面僅僅用作編輯
至於其他 具體設置 詳見API文檔 Unity-Camera:
網頁鏈接
6. unity里2d攝像機怎麼設置攝像機大小
新建腳本 掛載到攝像機上,然後把代碼丟進去就行了。
public class Scale : MonoBehaviour
{
//速度
public float ChangeSpeed = 0.5f;
private float maximum = 13;
private float minmum = 7;
void Update()
{
if (Input.GetAxis("Mouse ScrollWheel") != 0)
{
//限制size大小
Camera.main.orthographicSize =Mathf.Clamp(Camera.main.orthographicSize, minmum, maximum);
//滾輪改變
Camera.main.orthographicSize =
Camera.main.orthographicSize - Input.GetAxis
("Mouse ScrollWheel") * ChangeSpeed;
}
}
}
Unity是一款由Unity Technologies研發的跨平台2D/3D游戲引擎:
它以交互的圖型化開發環境為首要方式,編譯器運行在Windows 和Mac OS X下,可發布游戲至Windows、Wii、OSX、iOS或HTML5等眾多平台。此外,Unity 還是被廣泛用於建築可視化、實時三維動畫等類型互動內容的綜合型創作工具。
7. Unity 限制攝像機在一定區域內移動
本案例中移動模型所採用的方案為:移動攝像機; 那麼要限制模型的移動范圍(該教程中,只允許模型在可視范圍內移動,防止模型被移動丟失),可以考慮採用限制攝像機的范圍。
首先明白,空間的點也可以看做一個向量! 什麼叫向量(矢量)呢?(有大小、方向的量)
平面可以由法向量和平面內的一點來確定,因為過一點,有且只有一個平面與已知直線垂直。
上圖為射線與平面的交點
有了射線和平面的參數方程,那麼求二者的交點相當於解下面的方程組
注意這里兩個方程中的p0是不同的,為區別彼此,將平面方程中的p0改為p1,並將射線方程代入平面方程,整理得到
若t >= 0, 則射線與平面相交,且交點為p0 + tu,若t < 0,則不相交。(注意這里,n不可約去,因為做的是點積,而不是普通乘法)
** 說明: n是法向量的單位向量; u 是射線的單位向量;p1 為平面上的一點,p0為交點**
其中的重點知識來了: 求在同一平面的兩線段的交點~~
分為兩步驟:
判斷兩線段是否相交
求交點
** 判斷是否相交**,用到跨立實驗-- 傳送門: http://www.cnblogs.com/dwdxdy/p/3230485.html
如果兩線段相交,則兩線段必然相互跨立對方。
若P1P2跨立Q1Q2,則矢量(P1-Q1)和(P2-Q1)位於矢量(Q2-Q1)的兩側,即( P1 - Q1 ) × ( Q2 - Q1 ) * ( P2 - Q1 ) × ( Q2 - Q1 ) < 0。
若Q1Q2跨立P1P2,則矢量(Q1-P1)和(Q2-P1)位於矢量(P2-P1)的兩側,即( Q1 - P1 ) × ( P2 - P1 ) * ( Q2 - P1 ) × ( P2 - P1 ) < 0。
排斥實驗和跨立實驗的示例如下圖所示
求交點
空間線段的交點演算法可以參照二維線段的交點演算法:
需求: 限制模型在一定范圍內移動,即圖2中彩色范圍內。
分析: 由於程序採用攝像機移動的方法來實現模型的移動, 那麼限制模型的移動范圍就是限制攝像機的移動范圍。
解題思路:
內容如有不足之處,請指正
8. unity怎麼把攝像頭范圍顯示出來
Unity中調用攝像頭顯示實時...
點擊工具欄中的play,在Game視圖下點擊按鈕On,即可顯示出視頻。 本節就Unity調用Unity中調用攝像頭顯示實時...
最後,點擊工具欄中的play,在Game視圖下點擊按鈕On,即可顯示出視頻。 本節就Unity調用Unity中調用攝像頭顯示實時...
最後,點擊工具欄中的play,在Game視圖下點擊按鈕On,即可顯示出視頻。 本節就Unity調用