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调用