C# Camera

Camera 摄像机

Camera是一个设备,玩家通过它看世界

Camera.actualRenderingPath 实际渲染路径

实际使用的渲染路径

RenderingPath actualRenderingPath;

Camera.allCameras 所有相机

返回场景中所有启用的相机

public int count = Camera.allCameras.Length;

void Example() {

    print ("we've got" + count + "cameras");

}

Camera.allCamerasCount 所有相机数量

当前场景中相机数量

var count : int = Camera.allCamerasCount;

print ("we've got" + count + "cameras");

Camera.aspect 长宽比

长宽比

if (camera.aspect > 1.0F)

    print("Screen is more wide than tall!");

else

    print("Screen is more tall than wide!");

Camera.backgroundColor 背景颜色

屏幕将被清理为这个颜色

public Color color1 = Color.red;

public Color color2 = Color.blue;

public float duration = 3.0F;

void Update() {

    float t = Mathf.PingPong(Time.time, duration) / duration;

    camera.backgroundColor = Color.Lerp(color1, color2, t);

}

void Example() {

    camera.clearFlags = CameraClearFlags.SolidColor;

}

Camera.CalculateObliqueMatrix 计算倾斜矩阵

计算并返回倾斜接近水平的投影矩阵

Matrix4x4 CalculateObliqueMatrix(Vector4 clipPlane);

Camera.cameraToWorldMatrix 相机转世界矩阵

从相机空间到世界空间的变换矩阵

public float distance = -1.0F;

void OnDrawGizmosSelected() {

    Matrix4x4 m = camera.cameraToWorldMatrix;

    Vector3 p = m.MultiplyPoint(new Vector3(0, 0, distance));

    Gizmos.color = Color.yellow;

    Gizmos.DrawSphere(p, 0.2F);

}

Camera.clearFlags 清除标识(可理解为背景填充)

相机如何清除背景

camera.clearFlags = CameraClearFlags.SolidColor;

Camera.CopyFrom 复制到

使这个相机的设置与其他相机相同

camera.CopyFrom(Camera.main);

Camera.current 当前相机

当前用于渲染的相机,只用于低级的渲染控制

static Camera current;

Camera.depth 深度

相机在渲染顺序上的深度

camera.depth = Camera.main.depth + 1;

Camera.depthTextureMode 深度纹理模式

相机生成怎样的一个深度纹理

public void Awake() {

    camera.depthTextureMode = DepthTextureMode.DepthNormals;

}

Camera.eventMask 事件遮挡

遮挡相机的触发事件图层

int eventMask;

Camera.farClipPlane 远裁剪平面

远裁剪面的距离

camera.farClipPlane = 100.0F;

Camera.fieldOfView 视野

相机的视野,以度为单位

public void Awake() {

    camera.fieldOfView = 60;

}

Camera.GetAllCameras 获取所有相机

用当前场景中的摄像机填补相机的数组,而不需要分配一个新的数组

static int GetAllCameras(Camera[] cameras);

Camera.hdr 高动态范围

高动态范围渲染

bool hdr;

Camera.layerCullDistances 层消隐距离

每层的消隐距离

void Start() {

    float[] distances = new float[32];

    distances[10] = 15;

    camera.layerCullDistances = distances;

}

Camera.layerCullSpherical 球面层消隐

相机如何执行每层的消隐

camera.layerCullSpherical = true;

Camera.main 主相机

第一个启用的被标记为“MainCanmera”的相机

static Camera main;

Camera.nearClipPlane 近裁剪平面

近裁剪面的距离

camera.nearClipPlane = 0.1F;

Camera.OnPostRender() 渲染之后

OnPostRender函数在相机渲染场景之后调用

private bool revertFogState = false;

void OnPreRender() {

    reverFogState = RenderSettings.fog;

    RenderSettings.fog = enabled;

}

void OnPostRender() {

    RenderSettings.fog = revertFogState;

}

Camera.OnPreCull() 消隐之前

OnPreCull在相机开始裁剪场景之前调用

void OnPreCull() {

    camera.ResetWorldToCameraMatrix();

    camera.ResetProjectionMatrix();

    camera.projectionMatrix = camera.projectionMatrix * Matrix4x4.Scale(new Vector3(1, -1, 1));

}

void OnPreRender() {

    GL.SetRevertBackfacing(true);

}

void OnPostRender() {

    GL.SetRevertBackfacing(false);

}

Camera.OnRenderImage(RenderTexture,RenderTexture) 在渲染图像之后

OnRenderImage在所有渲染完成后被调用,来渲染图片的后期处理效果

public Material mat;

void OnRenderImage(RenderTexture src, RenderTexture dest) {

    Graphics.Blit(src, dest, mat);

}

Camera.OnRenderObject() 在渲染物体之后

OnRenderObject 被用来渲染你自己的物体,使用或者其他函数

public Mesh mainMesh;

public Mesh miniMapMesh;

void OnRenderObject() {

    if (Camera.current.name == "MiniMapcam")

        Graphics.DrawMeshNow(miniMapMesh, transform.position, transform.rotation);

    else

        Graphics.DrawMeshNow(mainMesh, transform.position, transform.rotation);

}

Camera.OnWillRenderObject() 在渲染物体之前

如果物体可见,每个相机都会调用OnWillRenderObject

Camera.orthographic 正交

相机是正交的(true),是透视的(false)

camera.orthographic = true;

Camera.orthographicSize 正交大小

camera.orthographic = true;

camera.orthographicSize = 5;

Camera.pixelHeight 相机高度

相机有多高,以像素单位

print("Camera is " + camera.pixelHeight + " pixels high");

Camera.pixelRect 像素矩形

相机被渲染到屏幕像素中的位置

void Update() {

    Rect r = camera.pixelRect;

    print("Camera displays from " + r.xMin + " to " + r.xMax + " pixel");

}

Camera.pixelWidth 相机宽度

相机有多宽,以像素单位

print("Camera is " + camera.pixelWidth + " pixels wide");

Camera.projectionMatrix 投影矩阵

设置自定义的投影矩阵

public Matrix4x4 originalProjection;

void Update() {

    Matrix4x4 p = originalProjection;

    p.m01 += Mathf.Sin(Time.time * 1.2F) * 0.1F;

    p.m10 += Mathf.Sin(Time.time * 1.5F) * 0.1F;

    camera.projectionMatrix = p;

}

void Example() {

    originalProjection = camera.projectionMatrix;

}

Camera.rect 矩形

相继被渲染到屏幕规范化坐标中的位置

function Update () {

    if (Input.GetButtonDown ("Jump")) {

        var margin = Random.Range (0.0, 0.3);

        camera.rect = Rect (margin, 0, 1 - margin * 2, 1);

    }

}

Camera.Render 渲染

手动渲染相机

Texture2D RTImage(Camera cam) {

    RenderTexture currentRT = RenderTexture.active;

    RenderTexture.active = cam.targetTexture;

    cam.Render();

    Texture2D image = new Texture2D(cam.targetTexture.width, cam.targetTexture.height);

    image.ReadPixels(new Rect(0, 0, cam.targetTexture.width, cam.targetTexture.height), 0, 0);

    image.Apply();

    RenderTexture.active = currentRT;

    return image;

}

Camera.renderingPath 渲染路径

渲染路径

RenderingPath renderingPath;

Camera.RenderToCubemap 渲染到立方图

从这个相机渲染到一个立方贴图

bool RenderToCubemap(Cubemap cubemap, int faceMask = 63);

Camera.RenderWithShader 用Shader渲染

用shader替代渲染相机

public Shader heatVisionShader;

void Example() {

    camera.RenderWithShader(heatVisionShader, "VisibleWithHeatVision");

}

Camera.ResetAspect 重设长宽比

恢复长宽比为屏幕的长宽比

void Example() {

    camera.ResetAspect();

}

Camera.ResetProjectionMatrix 重设投影矩阵

让投影反映正常的相机参数

void Example() {

    camera.ResetProjectionMatrix();

}

Camera.ResetReplacementShader 重设替换Shader

从相机上移除shader替换

void ResetReplacementShader();

Camera.ResetWorldToCameraMatrix 重设世界转相机矩阵

在场景中让渲染位置反射相机的位置

void Example() {

    camera.ResetWorldToCameraMatrix();

}

Camera.ScreenPointToRay 屏幕位置转射线

返回一条射线从摄像机通过一个屏幕点

void Update() {

    Ray ray = camera.ScreenPointToRay(new Vector3(200, 200, 0));

    Debug.DrawRay(ray.origin, ray.direction * 10, Color.yellow);

}

Camera.ScreenToViewportPoint 屏幕转视窗位置

从屏幕空间到视窗空间的变换位置

void Update() {

    transform.position = Camera.main.ScreenToViewportPoint(Input.mousePosition);

}

Camera.ScreenToWorldPoint 屏幕转世界位置

从屏幕空间到世界空间的变化位置

void OnDrawGizmosSelected() {

    Vector3 p = camera.ScreenToWorldPoint(new Vector3(100, 100, camera.nearClipPlane));

    Gizmos.color = Color.yellow;

    Gizmos.DrawSphere(p, 0.1F);

}

Camera.ResetReplacementShader 设置替换着色器

使相机渲染用着色器替换

public Shader heatVisionShader;

void Example() {

    camera.SetReplacementShader(heatVisionShader, "VisibleWithHeatVision");

}

Camera.SetTargetBuffers 设置目标缓冲区域

设置相机渲染到一个或多个RenderTextures所选择的缓冲区

void SetTargetBuffers(RenderBuffer colorBuffer, RenderBuffer depthBuffer);

Camera.stereoConvergence 立体聚焦

虚拟视点相交点间距

float stereoConvergence;

Camera.stereoEnabled 开启立体

立体渲染

bool stereoEnabled;

Camera.stereoSeparation 立体分离

虚拟眼间距离

float stereoSeparation;

Camera.targetTexture 目标纹理

描述渲染纹理

RenderTexture targetTexture;

Camera.transparencySortMode 透明物体排序模式

透明物体的排序模式

TransparencySortMode transparencySortMode;

Camera.useOcclusionCulling 使用遮挡剔除

无论是否在渲染过程中相机都会使用遮挡剔除

bool useOcclusionCulling;

Camera.velocity 速度

获取世界空间中相机的速度

void Update() {

    print("Camera moving at " + camera.velocity.magnitude + " m/s");

}

Camera.ViewportPointToRay 视窗位置转射线

返回从相机出发穿过视点的一个射线

void Update() {

Ray ray = camera.ViewportPointToRay(new Vector3(0.5F, 0.5F, 0));

RaycastHit hit;

if (Physics.Raycast(ray, out hit))

    print("I'm looking at " + hit.transform.name);

else

    print("I'm looking at nothing!");

}

Camera.ViewportToScreenPoint 视窗转屏幕位置

从视口空间到屏幕空间的变换位置

public Texture2D bottomPanel;

void VPToScreenPtExample() {

    Vector3 origin = Camera.main.ViewportToScreenPoint(new Vector3(0.25F, 0.1F, 0));

    Vector3 extent = Camera.main.ViewportToScreenPoint(new Vector3(0.5F, 0.2F, 0));

    GUI.DrawTexture(new Rect(origin.x, origin.y, extent.x, extent.y), bottomPanel);

}

Camera.ViewportToWorldPoint 视窗转世界位置

从视窗空间到世界空间的变换位置

void OnDrawGizmosSelected() {

    Vector3 p = camera.ViewportToWorldPoint(new Vector3(1, 1, camera.nearClipPlane));

    Gizmos.color = Color.yellow;

    Gizmos.DrawSphere(p, 0.1F);

}

Camera.worldToCameraMatrix 世界转相机矩阵

从世界到相机空间的变换矩阵

public Vector3 offset = new Vector3(0, 1, 0);

void LateUpdate() {

    Vector3 camoffset = new Vector3(-offset.x, -offset.y, offset.z);

    Matrix4x4 m = Matrix4x4.TRS(camoffset, Quaternion.identity, new Vector3(1, 1, -1));

    camera.worldToCameraMatrix = m * transform.worldToLocalMatrix;

}

Camera.WorldToScreenPoint 世界转屏幕位置

从世界空间到屏幕空间变换位置

public Transform target;

void Update() {

    Vector3 screenPos = camera.WorldToScreenPoint(target.position);

    print("target is " + screenPos.x + " pixels from the left");

}

Camera.WorldToViewportPoint 世界转视窗位置

从世界空间到视窗空间的变换位置

public Transform target;

void Update() {

    Vector3 viewPos = camera.WorldToViewportPoint(target.position);

    if (viewPos.x > 0.5F)

        print("target is on the right side!");

    else

        print("target is on the left side!");

}

Camera.cullingMask 消隐遮罩

这个用来选择性的渲染部分场景

public void Awake() {

    camera.cullingMask = 1 << 0;

}

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值