• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

Unity zSpace 开发

武飞扬头像
橘长长长
帮助1

本篇博客适合没有zSpace开发经验的朋友,从下载SDK到配置发布、UI事件、触控笔事件。。

一、项目设置

第一步:官网下载zCore和zView插件,下载并安装Unity2018(我的是2018.4.3)

学新通

第二步:将下载的zCore6.0和zView6.0导入到Unity的工程中,导入后会生成两个文件夹

学新通 3

第三步:设置你的Unity工程

1.Edit—ProjectSettings—Player—OtherSetting—Rendering—ColorSpace改为Gamma

2.Edit—ProjectSettings—Player—OtherSetting—AutoGraphicsAPIforWindows取消勾选

3.Edit—ProjectSettings—Player—OtherSetting—GraphicsAPIsforWindows-添加OpenGLCore,其他全部删除

学新通

4.Edit—ProjectSettings—Player—OtherSetting—Configuration—ScriptingRuntimeVersion改为4.x

学新通

5.Edit—ProjectSettings—Player—XRSetting中勾选Virtual Reality Supported

6.Edit—ProjectSettings—Player—XRSetting—Virtual Reality SDKs添加Stereo Display (non head-mounted)

学新通

 7.Edit—ProjectSettings—Player—Resolution and Presentation—Run In Back ground选中(如果不用zView可以不设置此项)

学新通

第四步:查看zCore自带案例,如下

学新通

 第五步:发布测试,找到一个适合自己想要功能的场景,发布到PC后,将发布程序拷贝到zSpace设备上运行即可

第六步:如果你的软件不使用zView的话忽略此项

1.将zView预制体拖拽到场景中

2.zView组件如下:

学新通

配置zView

大多数情况下,ZView应该在你第一次测试时就能工作。然而,越来越复杂的场景更有可能遇到图形问题时,通过zView的增强现实模式。在zView的检查器字段中出现的公共属性可以用来管理这种复杂性。

Ignore Layers

你可以在zView中隐藏对象,方法是把它们放在可以忽略的层上。有一些常见的元素需要考虑zView忽略。在zView表示过程中,UI元素通常不是内容焦点,而是被隐藏的主要考虑因素。其他可能值得忽略的元素将是周边环境艺术,在AR模式下不能正确或清晰地呈现。

Mask Layer

zView在zSpace显示周围放置一个蒙版,在显示表面上有一个洞。设置到此层的对象将只通过此显示蒙版可见。这个遮罩将优先于正视差框遮罩,不管遮罩对象是负视差还是正视差。

Mask Render Queue

增强现实模式的框蒙版的渲染队列优先级。这只在启用ARModeEnableTransparency时使用,通常应该分配小于2000(不透明几何)的值,以确保它的深度将在渲染任何不透明几何之前进行渲染。

Mask Size

增强现实模式的盒子面具的尺寸,单位是米。盒子面具不同于

Show Mask

在Unity Editor的SceneView窗口中启用增强现实模式的框掩码的调试可视化。

Enable Transparency

如果未启用,则强制增强现实模式的虚拟相机渲染的所有非蒙版像素的alpha值为1。默认情况下,这是禁用的,因为大多数与不透明和透明几何相关的标准着色器要么在它们的alpha通道中有不正确的值,要么不写它们的alpha通道到帧缓冲区。

Active ZCamera

确保这个属性被分配给在任何时候都在积极使用的ZCamera。如果没有分配,ZView将在awake时调用. findobjectoftype()来自己找到它,但理想情况下它将手工分配。

 连接到zView(放到Start()中):

  1.  
    IntPtr connection = zView.GetCurrentActiveConnection();
  2.  
    if(connection == IntPtr.Zero)
  3.  
    {
  4.  
    zView.ConnectToDefaultViewer();
  5.  
    }

示例:

  1.  
    private void Start()
  2.  
    {
  3.  
    #if !UNITY_EDITOR
  4.  
    ZView _zView = GameObject.FindObjectOfType<ZView>();
  5.  
    IntPtr connection = _zView.GetCurrentActiveConnection();
  6.  
    if (connection == IntPtr.Zero)
  7.  
    {
  8.  
    _zView.ConnectToDefaultViewer();
  9.  
    }
  10.  
    #endif
  11.  
    }

 看到此项表示你的zSpace工程已经全部配置完成,点击发布运行起来吧~

上述在官网都可查到出处Unity3D zCore 6.0: Developer Guide (zspace.com)学新通https://developer.zspace.com/docs/unity3d-zcore-6-guide 

二、UI系统

1.画布设置

在zSpace-Core-Prefabs中可以看到ZCanvas预制体,拖拽到场景中,ZCanvas默认渲染模式是WorldSpace,将zSpace的相机拖拽至EventCamera即可,并确保ZCanvas添加了以下组件

学新通

2.Button事件

UI事件:经过测试,button.onClick.AddListener()的UI事件可以触发,而手动绑定的无法触发

学新通

3D事件:通过引入命名空间IBeginDragHandler, IDragHandler, IEndDragHandler来实现

学新通

触控笔中键:PointerEventData.InputButton.Left

触控笔左键:PointerEventData.InputButton.Middle

触控笔右键:PointerEventData.InputButton.Right

示例:用触控笔来实现对模型的拖拽、旋转、放大、缩小功能:

  1.  
     
  2.  
    //
  3.  
    // Copyright (C) 2007-2020 zSpace, Inc. All Rights Reserved.
  4.  
    //
  5.  
     
  6.  
     
  7.  
    using UnityEngine;
  8.  
    using UnityEngine.EventSystems;
  9.  
     
  10.  
    using zSpace.Core.EventSystems;
  11.  
    using zSpace.Core.Input;
  12.  
     
  13.  
    namespace zSpace.Core.Samples
  14.  
    {
  15.  
    public class MyDraggable : ZPointerInteractable, IBeginDragHandler, IDragHandler, IEndDragHandler
  16.  
    {
  17.  
     
  18.  
    // Public Methods
  19.  
     
  20.  
     
  21.  
    public override ZPointer.DragPolicy GetDragPolicy(ZPointer pointer)
  22.  
    {
  23.  
    if (pointer is ZMouse)
  24.  
    {
  25.  
    return ZPointer.DragPolicy.LockToScreenAlignedPlane;
  26.  
    }
  27.  
     
  28.  
    if (pointer is ZStylus)
  29.  
    {
  30.  
    return ZPointer.DragPolicy.LockHitPosition;
  31.  
    }
  32.  
     
  33.  
    return base.GetDragPolicy(pointer);
  34.  
    }
  35.  
     
  36.  
    public void OnBeginDrag(PointerEventData eventData)
  37.  
    {
  38.  
    ZPointerEventData pointerEventData = eventData as ZPointerEventData;
  39.  
    if (pointerEventData == null ||
  40.  
    pointerEventData.button != PointerEventData.InputButton.Left)
  41.  
    {
  42.  
    return;
  43.  
    }
  44.  
     
  45.  
    Pose pose = pointerEventData.Pointer.EndPointWorldPose;
  46.  
     
  47.  
    // Cache the initial grab state.
  48.  
    this._initialGrabOffset =
  49.  
    Quaternion.Inverse(this.transform.rotation) *
  50.  
    (this.transform.position - pose.position);
  51.  
     
  52.  
    this._initialGrabRotation =
  53.  
    Quaternion.Inverse(pose.rotation) *
  54.  
    this.transform.rotation;
  55.  
     
  56.  
    // If the grabbable object has a rigidbody component,
  57.  
    // mark it as kinematic during the grab.
  58.  
    var rigidbody = this.GetComponent<Rigidbody>();
  59.  
    if (rigidbody != null)
  60.  
    {
  61.  
    this._isKinematic = rigidbody.isKinematic;
  62.  
    rigidbody.isKinematic = true;
  63.  
    }
  64.  
     
  65.  
    // Capture pointer events.
  66.  
    pointerEventData.Pointer.CapturePointer(this.gameObject);
  67.  
    }
  68.  
     
  69.  
    private float z;
  70.  
    private void Start()
  71.  
    {
  72.  
    z = transform.localPosition.z;
  73.  
    }
  74.  
    public void OnDrag(PointerEventData eventData)
  75.  
    {
  76.  
    ZPointerEventData pointerEventData = eventData as ZPointerEventData;
  77.  
    if (pointerEventData == null)
  78.  
    {
  79.  
    return;
  80.  
    }
  81.  
     
  82.  
    if (pointerEventData.button == PointerEventData.InputButton.Left)
  83.  
    {
  84.  
    Pose pose = pointerEventData.Pointer.EndPointWorldPose;
  85.  
     
  86.  
    // Update the grab object's rotation.
  87.  
    this.transform.rotation = pose.rotation * this._initialGrabRotation;
  88.  
     
  89.  
    // Update the grab object's position.
  90.  
    this.transform.position = pose.position (this.transform.rotation * this._initialGrabOffset);
  91.  
     
  92.  
    }
  93.  
    if (pointerEventData.button == PointerEventData.InputButton.Right)
  94.  
    {
  95.  
    if (transform.position.z > z)
  96.  
    {
  97.  
    transform.localScale = new Vector3(transform.localScale.x 0.01f, transform.localScale.y 0.01f, transform.localScale.z 0.01f);
  98.  
    }
  99.  
    else if(transform.position.z < z)
  100.  
    {
  101.  
    transform.localScale = new Vector3(transform.localScale.x - 0.01f, transform.localScale.y - 0.01f, transform.localScale.z - 0.01f);
  102.  
    }
  103.  
    //transform.localScale = new Vector3(transform.localScale.x 0.01f, transform.localScale.y 0.01f, transform.localScale.z 0.01f);
  104.  
    }
  105.  
    //if (pointerEventData.button == PointerEventData.InputButton.Middle)
  106.  
    //{
  107.  
    // transform.localScale = new Vector3(transform.localScale.x - 0.01f, transform.localScale.y - 0.01f, transform.localScale.z - 0.01f);
  108.  
    //}
  109.  
    }
  110.  
     
  111.  
    public void OnEndDrag(PointerEventData eventData)
  112.  
    {
  113.  
    ZPointerEventData pointerEventData = eventData as ZPointerEventData;
  114.  
    if (pointerEventData == null ||
  115.  
    pointerEventData.button != PointerEventData.InputButton.Left)
  116.  
    {
  117.  
    return;
  118.  
    }
  119.  
     
  120.  
    // Release the pointer.
  121.  
    pointerEventData.Pointer.CapturePointer(null);
  122.  
     
  123.  
    // If the grabbable object has a rigidbody component,
  124.  
    // restore its original isKinematic state.
  125.  
    var rigidbody = this.GetComponent<Rigidbody>();
  126.  
    if (rigidbody != null)
  127.  
    {
  128.  
    rigidbody.isKinematic = this._isKinematic;
  129.  
    }
  130.  
    }
  131.  
     
  132.  
     
  133.  
    // Private Members
  134.  
     
  135.  
     
  136.  
    private Vector3 _initialGrabOffset = Vector3.zero;
  137.  
    private Quaternion _initialGrabRotation = Quaternion.identity;
  138.  
    private bool _isKinematic = false;
  139.  
    }
  140.  
    }
学新通

上述皆参考ZCore自带脚本:Draggable

学新通

目前也在学习阶段,有问题随时留言讨论学习~ 

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhfiejhb
系列文章
更多 icon
同类精品
更多 icon
继续加载