返回介绍

Camera.projectionMatrix 投影矩阵

发布于 2019-12-18 15:37:28 字数 5294 浏览 1097 评论 0 收藏 0

JavaScript => var projectionMatrix: Matrix4x4;
C# => Matrix4x4 projectionMatrix;

Description 描述

Set a custom projection matrix.

设置自定义的投影矩阵。

If you change this matrix, the camera no longer updates its rendering based on its fieldOfView. This lasts until you call ResetProjectionMatrix.

如果你改变这个矩阵,相机的渲染不再基于它的fieldOfView更新,直到调用ResetProjectionMatrix.

Use a custom projection only if you really need a non-standard projection. This property is used by Unity's water rendering to setup an oblique projection matrix. Using custom projections requires good knowledge of transformation and projection matrices.

只有当真正需要一个非标准的投影时,才使用自定义投影。这个属性被Unity的水渲染使用来设置一个oblique projection 矩阵。使用自定义投影需要了解变换和投影矩阵。

JavaScript:

	// Make camera wobble in a funky way!
	var originalProjection : Matrix4x4;
	originalProjection = camera.projectionMatrix;
 
	function Update () {
		var p : Matrix4x4 = originalProjection;
		// change some values from the original matrix
		p.m01 += Mathf.Sin (Time.time * 1.2) * 0.1;
		p.m10 += Mathf.Sin (Time.time * 1.5) * 0.1;
		camera.projectionMatrix = p;
	}

JavaScript:

	// Set an off-center projection, where perspective's vanishing
	// point is not necessarily in the center of the screen.
	//
	// left/right/top/bottom define near plane size, i.e.
	// how offset are corners of camera's near plane.
	// Tweak the values and you can see camera's frustum change.	@script ExecuteInEditMode	var left : float = -0.2;
	var right : float = 0.2;
	var top : float = 0.2;
	var bottom : float = -0.2;	function LateUpdate () {
		var cam : Camera = camera;
		var m : Matrix4x4 = PerspectiveOffCenter(
			left, right, bottom, top,
			cam.nearClipPlane, cam.farClipPlane );
		cam.projectionMatrix = m;
	}	static function PerspectiveOffCenter(
		left : float, right : float,
		bottom : float, top : float,
		near : float, far : float ) : Matrix4x4
	{        
		var x : float =  (2.0 * near) / (right - left);
		var y : float =  (2.0 * near) / (top - bottom);
		var a : float =  (right + left) / (right - left);
		var b : float =  (top + bottom) / (top - bottom);
		var c : float = -(far + near) / (far - near);
		var d : float = -(2.0 * far * near) / (far - near);
		var e : float = -1.0;		var m : Matrix4x4 = new Matrix4x4();
		m[0,0] = x;  m[0,1] = 0;  m[0,2] = a;  m[0,3] = 0;
		m[1,0] = 0;  m[1,1] = y;  m[1,2] = b;  m[1,3] = 0;
		m[2,0] = 0;  m[2,1] = 0;  m[2,2] = c;  m[2,3] = d;
		m[3,0] = 0;  m[3,1] = 0;  m[3,2] = e;  m[3,3] = 0;
		return m;
	}

C#:

using UnityEngine;
using System.Collections;
 
public class ExampleClass : MonoBehaviour {
    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;
    }
}
 

C#:

using UnityEngine;
using System.Collections;
 
[ExecuteInEditMode]
public class ExampleClass : MonoBehaviour {
    public float left = -0.2F;
    public float right = 0.2F;
    public float top = 0.2F;
    public float bottom = -0.2F;
    void LateUpdate() {
        Camera cam = camera;
        Matrix4x4 m = PerspectiveOffCenter(left, right, bottom, top, cam.nearClipPlane, cam.farClipPlane);
        cam.projectionMatrix = m;
    }
    static Matrix4x4 PerspectiveOffCenter(float left, float right, float bottom, float top, float near, float far) {
        float x = 2.0F * near / (right - left);
        float y = 2.0F * near / (top - bottom);
        float a = (right + left) / (right - left);
        float b = (top + bottom) / (top - bottom);
        float c = -(far + near) / (far - near);
        float d = -(2.0F * far * near) / (far - near);
        float e = -1.0F;
        Matrix4x4 m = new Matrix4x4();
        m[0, 0] = x;
        m[0, 1] = 0;
        m[0, 2] = a;
        m[0, 3] = 0;
        m[1, 0] = 0;
        m[1, 1] = y;
        m[1, 2] = b;
        m[1, 3] = 0;
        m[2, 0] = 0;
        m[2, 1] = 0;
        m[2, 2] = c;
        m[2, 3] = d;
        m[3, 0] = 0;
        m[3, 1] = 0;
        m[3, 2] = e;
        m[3, 3] = 0;
        return m;
    }
}

Camera

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文