Camera viewport

分屏
在unity里面摄像机分为main和一般的。
而camera里面存在一个叫做viewport的变量
Camera.rect
var rect : Rect
Description
Where on the screen is the camera rendered in normalized coordinates.


The values in rect range from zero (left/bottom) to one (right/top).


如上文所示 viewport就是视窗(视口)大小


 


对应的x,y,width,height分别为0,0,1,1


换句话说 假如想实现分屏效果只需要多创建一个camera把第一个camera的viewport改为(0,0,0.5,0.5),第二个camera的viewport则为(0.5,0.5,1,1)由此我们便能得到分屏的效果


而对于maincamera来说 想显示不同角度的小窗也是可以按照以上设置方式。当然数值上需要微调。


如何实现在maincamera下的分屏?
首先我们需要设置maincamera的clearFlags 默认创建时候是Skybox我们需要改变为Depth Only
因为SkyBox会替我们默认渲染背景颜色,而DepthOnly则会把背景颜色一同清掉。
然后我们创建2个camera
ViewportRect分别设置半屏 方法参见上文
于是乎我们就创建了主屏幕内的分屏


关于如何绘制viewport在maincamera上
在Unity里 分别有RenderTexture、Viewport和UI挖空三种方式能把3D模型画在主镜头前
此文只是给还是使用Unity的GUI的用户观看
首先RenderTexture这个一般不会有啥问题吧
创建流程一般是
Create a RenderTexture(看应用平台设置是否需要2的N次幂)
RenderTexture rt = new RenderTexture(width, height, depth);
如果需要设置2的N次幂
rt.isPowerOfTwo = true; 否则不需要写出来
然后就是创建一个摄像机
Camera cam = new Camera();
然后设置camera的各种属性
一般需要设置clearFlags = CameraClearFlag.Depth;
还有把camera设置为正交变换 orthgraphic = true;
重要的一个是横纵比aspect = 1;
等等
然后把rt赋到cam.targetTexture下即可


这种方式渲染出来的图像不会跟着窗口大小改变而进行拉伸,而是用Viewport的话则会根据窗口大小进行拉伸渲染区域,效果看看QQ飞车手动拉伸屏幕时人物模型的变化


首先 我们要确定GUI所画的图是基于MainCamera的最前方,不可能存在后方物件覆盖到GUI之上
所以一般使用不使用RenderTexture而想场景物件能渲染在UI前的话 要么靠Viewport要么靠把UI挖空 比如一张800*600的背景图为了显示一个模型在100,100, 200,200的位置 而不得不把此处的背景挖空再用背景mesh填补.
这样做显然不科学,而RenderTexture是用使用限制的 比如某些Android机子跑不起 IOS上存在使用上限等等.而是用Viewport则不存在以上顾虑.


首先我们创建好一个camera设置好各种参数后把camera对准想要渲染在UI上的物体.
之前设置分屏我们采用的是camera的rect,如果使用camera.rect最终渲染出来的图像还是会被GUI渲染的挡着,所以我们需要使用camera.pixelRect,这个像素矩形能让camera所看见的图像进入GUI的渲染流程里.
pixelRect的设置和rect的设置不一样
rect的设置无非是通过自己计算坐标位于屏幕的百分比位置0,0, 300/Screen.width, 300/Screen.height
而pixelRect则是屏幕上所渲染的实际位置 比如0,0, 300,300
最后我们需要把创建的camera的enabled属性设为false,因为后续流程里 我们需要手动执行camera的Render() 所以不需要它自动执行.


大概就是在OnGUI里
if(EventType.Repaint == Event.current.type)
   camera.Render();


详细代码 往后再完整写出来.




接前文
关于代码
渣浪的代码贴不上去 不知咋搞
把主要思路打一下好了,为了方便输入 用JS好了
//创建一个类保存camera信息
class MyCamera
{
public var mGameObj : GameObject;
public var mCamera : Camera;
}


class TestViewport extends Monobehaviour
{
public var mMyCamera : MyCamera = new MyCamera();
function Start()
{
mMyCamera.mGameObj = new GameObject("Camera");
mMyCamera.mCamera = mMyCamera.mGameObj.AddComponent(Camera);
//各种镜头设置 位置设置
mMyCamera.mCamera.enabled = false;
}


function OnGUI()
{
if(Event.current.type == EventType.Repaint)
mMyCamera.mCamera.Render();
}
}

猜你喜欢

转载自blog.csdn.net/a351945755/article/details/51941184