Параметры
view | Матрица просмотра (от мира до камеры). |
proj | Матрица проекции (камера на пространство клипа). |
Описание
Добавьте команду для установки матрицы вида и проекции.
Эта функция эквивалентна вызову SetViewMatrix и SetProjectionMatrix. Несколько эффективнее одновременное изменение обеих матриц.
Эта функция совместима со встроенным конвейером рендеринга. Он несовместим с универсальным конвейером рендеринга (URP), конвейером рендеринга высокого разрешения (HDRP) или пользовательскими конвейерами рендеринга с поддержкой сценариев.
Примечание. Пространство камеры в Unity соответствует соглашению OpenGL, поэтому отрицательная ось Z направлена камерой вперед. Это отличается от обычного соглашения Unity, где передняя часть камеры является положительной осью Z. Если вы вручную создаете матрицу представления, например, с помощью обратной Matrix4x4.LookAt, вам необходимо масштабировать ее на -1 по оси Z, чтобы получить правильное просмотреть матрицу.
using UnityEngine;
using UnityEngine.Rendering;
// Attach this script to a Camera and pick a mesh to render.
// When entering Play mode, this will render a green mesh at
// origin position, via a command buffer.
[RequireComponent(typeof(Camera))]
public class ExampleScript : MonoBehaviour
{
public Mesh mesh;
void Start()
{
var material = new Material(Shader.Find("Hidden/Internal-Colored"));
material.SetColor("_Color", Color.green);
var tr = transform;
var camera = GetComponent<Camera>();
// Code below does the same as what camera.worldToCameraMatrix would do. Doing
// it "manually" here to illustrate how a view matrix is constructed.
//
// Matrix that looks from camera's position, along the forward axis.
var lookMatrix = Matrix4x4.LookAt(tr.position, tr.position + tr.forward, tr.up);
// Matrix that mirrors along Z axis, to match the camera space convention.
var scaleMatrix = Matrix4x4.TRS(Vector3.zero, Quaternion.identity, new Vector3(1, 1, -1));
// Final view matrix is inverse of the LookAt matrix, and then mirrored along Z.
var viewMatrix = scaleMatrix * lookMatrix.inverse;
var buffer = new CommandBuffer();
buffer.SetViewProjectionMatrices(viewMatrix, camera.projectionMatrix);
buffer.DrawMesh(mesh, Matrix4x4.identity, material);
camera.AddCommandBuffer(CameraEvent.BeforeSkybox, buffer);
}
}
Смотрите так же: SetViewMatrix, SetProjectionMatrix, Camera.projectionMatrix, Matrix4x4.LookAt, Matrix4x4.Perspective.