shenjianxing 6b341ae2b4 适配VR
2025-04-01 16:16:45 +08:00

438 lines
14 KiB
C#

////////////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 2007-2020 , Inc. All Rights Reserved.
//
////////////////////////////////////////////////////////////////////////////////
using System;
using UnityEngine;
using GCSeries.Core.Extensions;
using GCSeries.Core.Interop;
namespace GCSeries.Core.Sdk
{
public class ZFrustum : ZNativeResource
{
public ZFrustum(ZViewport viewport, IntPtr nativePtr)
: base(nativePtr)
{
this._viewport = viewport;
this.CameraOffset = DefaultCameraOffset;
this.DisplayEulerAngles = ZDisplay.DefaultEulerAngles;
this.PortalModeFlags = ZPortalMode.None;
}
////////////////////////////////////////////////////////////////////////
// Public Static Members
////////////////////////////////////////////////////////////////////////
public static readonly float DefaultIpd = 0.06f;
public static readonly float DefaultNearClip = 0.03f;
public static readonly float DefaultFarClip = 100.0f;
public static readonly Vector3 DefaultCameraOffset =
Vector3.back * 0.25f;
public static readonly float CoupledZoneDepth = -0.13f;
public static readonly float UncoupledZoneDepth = 0.3f;
////////////////////////////////////////////////////////////////////////
// Public Properties
////////////////////////////////////////////////////////////////////////
/// <summary>
/// Gets/sets the physical separation, or inter-pupillary distance,
/// between the eyes in meters. (Default: 0.06)
/// </summary>
public float Ipd
{
get
{
return this.GetAttributeFloat(ZFrustumAttribute.Ipd);
}
set
{
this.SetAttribute(ZFrustumAttribute.Ipd, value);
}
}
/// <summary>
/// Gets/sets the near clipping plane for the frustum in meters.
/// (Default: 0.03)
/// </summary>
public float NearClip
{
get
{
return this.GetAttributeFloat(ZFrustumAttribute.NearClip);
}
set
{
this.SetAttribute(ZFrustumAttribute.NearClip, value);
}
}
/// <summary>
/// Gets/sets the far clipping plane for the frustum in meters.
/// (Default: 1000)
/// </summary>
public float FarClip
{
get
{
return this.GetAttributeFloat(ZFrustumAttribute.FarClip);
}
set
{
this.SetAttribute(ZFrustumAttribute.FarClip, value);
}
}
/// <summary>
/// Gets/sets the display's desired euler angles in degrees about the
/// X, Y, and Z axes. These angles are only used when PortalMode.Angle
/// is not enabled on the frustum. (Default: [x=90, y=0, z=0])
/// </summary>
public Vector3 DisplayEulerAngles
{
get
{
float x = this.GetAttributeFloat(
ZFrustumAttribute.DisplayAngleX);
float y = this.GetAttributeFloat(
ZFrustumAttribute.DisplayAngleY);
float z = this.GetAttributeFloat(
ZFrustumAttribute.DisplayAngleZ);
return new Vector3(x, y, z);
}
set
{
this.SetAttribute(ZFrustumAttribute.DisplayAngleX, value.x);
this.SetAttribute(ZFrustumAttribute.DisplayAngleY, value.y);
this.SetAttribute(ZFrustumAttribute.DisplayAngleZ, value.z);
}
}
/// <summary>
/// Gets/sets the offset of the camera in meters relative to the
/// center of the application window's viewport. This offset is
/// used when computing the transformation from viewport to camera
/// space. (Default: [x=0, y=0, z=-0.25])
/// </summary>
public Vector3 CameraOffset
{
get
{
ZVector3 cameraOffset;
ZPlugin.LogOnError(ZPlugin.GetFrustumCameraOffset(
this._nativePtr, out cameraOffset),
"GetFrustumCameraOffset");
return cameraOffset.ToVector3();
}
set
{
ZPlugin.LogOnError(ZPlugin.SetFrustumCameraOffset(
this._nativePtr, value.ToZVector3()),
"SetFrustumCameraOffset");
}
}
/// <summary>
/// Gets/sets the flags leveraged to enable features such as
/// angle-awareness.
/// </summary>
///
/// <remarks>
/// In portal mode, the scene is fixed relative to the physical
/// world, not the viewport. Refer to ZPortalMode for details on
/// portal modes available.
/// </remarks>
public ZPortalMode PortalModeFlags
{
get
{
ZPortalMode portalModeFlags = ZPortalMode.None;
ZPlugin.LogOnError(ZPlugin.GetFrustumPortalMode(
this._nativePtr, out portalModeFlags),
"GetFrustumPortalMode");
return portalModeFlags;
}
private set
{
ZPlugin.LogOnError(
ZPlugin.SetFrustumPortalMode(this._nativePtr, value),
"SetFrustumPortalMode");
}
}
/// <summary>
/// Gets/sets the frustum's current head pose.
/// </summary>
public Pose HeadPose
{
get
{
ZPose headPose;
ZPlugin.LogOnError(
ZPlugin.GetFrustumHeadPose(this._nativePtr, out headPose),
"GetFrustumHeadPose");
return headPose.ToPose();
}
set
{
ZPlugin.LogOnError(ZPlugin.SetFrustumHeadPose(
this._nativePtr, value.ToZPose()), "SetFrustumHeadPose");
}
}
/// <summary>
/// Computes the default head pose for most optimal
/// viewing perspective.
/// </summary>
public Pose DefaultHeadPose
{
get
{
Matrix4x4 displayToTrackerMatrix =
this._viewport.GetCoordinateSpaceTransform(
ZCoordinateSpace.Display,
ZCoordinateSpace.Tracker);
// Create the pose in display space.
Pose pose = new Pose(
Vector3.back * this.CameraOffset.magnitude,
Quaternion.identity);
// Transform the pose to tracker space before
// it is returned.
return pose.GetTransformedBy(displayToTrackerMatrix);
}
}
////////////////////////////////////////////////////////////////////////
// Public Methods
////////////////////////////////////////////////////////////////////////
/// <summary>
/// Gets the view matrix for the specified eye.
/// </summary>
///
/// <remarks>
/// The view matrix is right-handed because Unity cameras expect
/// view matrices to be right-handed.
/// </remarks>
///
/// <param name="eye">
/// The eye (left, right, or center) to retrieve the view matrix for.
/// </param>
///
/// <returns>
/// The view matrix for the specified eye.
/// </returns>
public Matrix4x4 GetViewMatrix(ZEye eye)
{
ZMatrix4 viewMatrix;
ZPlugin.LogOnError(ZPlugin.GetFrustumViewMatrix(
this._nativePtr, eye, out viewMatrix), "GetFrustumViewMatrix");
return viewMatrix.ToMatrix4x4(false);
}
/// <summary>
/// Gets a scaled view matrix for the specified eye.
/// </summary>
///
/// <remarks>
/// The view matrix is right-handed because Unity cameras expect
/// view matrices to be right-handed.
/// </remarks>
///
/// <param name="eye">
/// The eye (left, right, or center) to retrieve the view matrix for.
/// </param>
/// <param name="scale">
/// The scale to apply to the resultant view matrix.
/// </param>
///
/// <returns>
/// The scaled view matrix for the specified eye.
/// </returns>
public Matrix4x4 GetViewMatrix(ZEye eye, Vector3 scale)
{
Matrix4x4 viewMatrix =
Matrix4x4.Scale(scale) * this.GetViewMatrix(eye);
return viewMatrix.ToPoseMatrix();
}
/// <summary>
/// Gets the projection matrix for the specified eye.
/// </summary>
///
/// <remarks>
/// The projection matrix is right-handed because Unity cameras
/// expect projection matrices to be right-handed.
/// </remarks>
///
/// <param name="eye">
/// The eye (left, right, or center) to retrieve the projection
/// matrix for.
/// </param>
///
/// <returns>
/// The projection matrix for the specified eye.
/// </returns>
public Matrix4x4 GetProjectionMatrix(ZEye eye)
{
ZMatrix4 projectionMatrix;
ZPlugin.LogOnError(ZPlugin.GetFrustumProjectionMatrix(
this._nativePtr, eye, out projectionMatrix),
"GetFrustumProjectionMatrix");
return projectionMatrix.ToMatrix4x4(false);
}
/// <summary>
/// Gets the frustum planes (left, right, top, bottom, near, and far)
/// for the specified eye.
/// </summary>
///
/// <param name="eye">
/// The eye (left, right, or center) to retrieve the frustum
/// planes for.
/// </param>
///
/// <returns>
/// The frustum planes for the specified eye.
/// </returns>
public FrustumPlanes GetPlanes(ZEye eye)
{
ZFrustumBounds bounds;
ZPlugin.LogOnError(
ZPlugin.GetFrustumBounds(this._nativePtr, eye, out bounds),
"GetFrustumBounds");
return bounds.ToFrustumPlanes();
}
/// <summary>
/// Get the position of the specified eye in the specified
/// coordinate space.
/// </summary>
///
/// <param name="eye">
/// The eye (left, right, or center) to retrieve the position for.
/// </param>
/// <param name="coordinateSpace">
/// The coordinate space (Tracker, Display, Viewport, or Camera)
/// to retrieve the eye position in.
/// </param>
///
/// <returns>
/// The position of the specified eye in the specified
/// coordinate space.
/// </returns>
public Vector3 GetEyePosition(
ZEye eye, ZCoordinateSpace coordinateSpace)
{
ZVector3 eyePosition;
ZPlugin.LogOnError(ZPlugin.GetFrustumEyePosition(
this._nativePtr, eye, coordinateSpace, out eyePosition),
"GetFrustumEyePosition");
return eyePosition.ToVector3();
}
/// <summary>
/// Gets a float value for the specified frustum attribute.
/// </summary>
///
/// <param name="attribute">
/// The frustum attribute to retrieve the float value for.
/// </param>
///
/// <returns>
/// The float value for the specified frustum attribute.
/// </returns>
public float GetAttributeFloat(ZFrustumAttribute attribute)
{
float value = 0;
ZPlugin.LogOnError(ZPlugin.GetFrustumAttributeF32(
this._nativePtr, attribute, out value),
"GetFrustumAttributeF32");
return value;
}
/// <summary>
/// Gets a boolean value for the specified frustum attribute.
/// </summary>
///
/// <param name="attribute">
/// The frustum attribute to retrieve the boolean value for.
/// </param>
///
/// <returns>
/// The boolean value for the specified frustum attribute.
/// </returns>
public bool GetAttributeBool(ZFrustumAttribute attribute)
{
bool value = false;
ZPlugin.LogOnError(ZPlugin.GetFrustumAttributeB(
this._nativePtr, attribute, out value), "GetFrustumAttributeB");
return value;
}
/// <summary>
/// Sets the float value for the specified frustum attribute.
/// </summary>
///
/// <param name="attribute">
/// The frustum attribute to update.
/// </param>
/// <param name="value">
/// The float value to update the frustum attribute with.
/// </param>
public void SetAttribute(ZFrustumAttribute attribute, float value)
{
ZPlugin.LogOnError(ZPlugin.SetFrustumAttributeF32(
this._nativePtr, attribute, value), "SetFrustumAttributeF32");
}
/// <summary>
/// Sets the boolean value for the specified frustum attribute.
/// </summary>
///
/// <param name="attribute">
/// The frustum attribute to update.
/// </param>
/// <param name="value">
/// The boolean value to update the frustum attribute with.
/// </param>
public void SetAttribute(ZFrustumAttribute attribute, bool value)
{
ZPlugin.LogOnError(ZPlugin.SetFrustumAttributeB(
this._nativePtr, attribute, value), "SetFrustumAttributeB");
}
////////////////////////////////////////////////////////////////////////
// Private Members
////////////////////////////////////////////////////////////////////////
private ZViewport _viewport = null;
}
}