Camera viewport
来源:互联网 发布:农村淘宝报名表格 编辑:程序博客网 时间:2024/06/10 20:30
分屏
在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();
}
}
在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();
}
}
0 0
- Camera viewport
- 8.camera and viewport
- Projection, viewport, & camera
- 视口与摄像机 (viewport & camera) 翻译
- OGRE 学习笔记(Camera和Viewport)
- OGRE 学习笔记(Camera和Viewport)
- OGRE 学习笔记(Camera和Viewport)
- Ogre Camera/ViewPort/Lights/Shadows基本理解
- Ogre: RenderWindow,Viewport,Camera,SceneManager关联分析
- viewport
- ViewPort
- Viewport
- Viewport
- viewport
- viewport
- viewport
- viewport
- viewport
- HDU 1839 Delay Constrained Maximum Capacity Path(最短路+二分)
- Google APAC 2017 University Test Round A
- Maven搭建SpringMVC+Hibernate项目详解
- tomcat8 gzip 优化配置
- python类库[进程subprocess与管道pipe]
- Camera viewport
- 【例题&结论】【分治(等比数列二分求和)】NKOJ 3716 数列求和
- 深入Hadoop HDFS(二)
- ubuntu下如何使用mysql/python中如何调用sql新建一个数据库
- Python2.7.x基础教程笔记--input与raw_input的区别
- JHUD简介(附下载地址)
- sublime3下插件安装
- java单例模式的应用--->单例的kafka链接
- python lxml库etree解析html