当前位置: 首页 > news >正文

网站建设合同 附件网站建设课程设计总结

网站建设合同 附件,网站建设课程设计总结,学广告设计前景怎么样,wordpress丰富搜索页Unity VR 场景手柄交互实现方案 需求 在已创建好的 Unity VR 场景中#xff0c;接入游戏手柄#xff0c;通过结合动捕系统与 VRPN#xff0c;建立刚体#xff0c;实时系统获取到手柄的定位数据与按键数据#xff0c;通过编写代码实现手柄的交互逻辑#xff0c;实现手柄…Unity VR 场景手柄交互实现方案 需求 在已创建好的 Unity VR 场景中接入游戏手柄通过结合动捕系统与 VRPN建立刚体实时系统获取到手柄的定位数据与按键数据通过编写代码实现手柄的交互逻辑实现手柄抓起物体移动放置。 演示视频 资源工程附件 评论区回复VR交互 实现方案 1. 控制抓取物体的平移运动不考虑旋转 仅控制抓取物体的前后上下左右方向的平移运动不考虑手柄的旋转 using UnityEngine; using UVRPN.Core;public class HandleInteraction : MonoBehaviour {public LayerMask targetLayer; // 目标物体所在的层public float rayLength 5f; // 射线的长度private GameObject selectedObject; // 当前选中的物体private Vector3 offset; // 物体与手柄的相对位置private bool isHoldingObject false; // 是否正在抓取物体的标志private VRPN_Button vrpnButton; // VRPN_Button 组件的引用void Start(){vrpnButton GetComponentVRPN_Button();// 或者如果 VRPN_Button 组件在其他 GameObject 上// vrpnButton GameObject.Find(GameObjectName).GetComponentVRPN_Button();}// Update is called once per framevoid Update(){// 发射射线Ray ray new Ray(transform.position, -transform.forward);RaycastHit hit;// 如果射线击中了目标层上的物体if (Physics.Raycast(ray, out hit, rayLength, targetLayer)){Debug.DrawLine(ray.origin, hit.point, Color.red); // 绘制射线仅在 Scene 视图中可见// 检测手柄按钮是否被按下if (vrpnButton.ButtonDown){// 抓取物体selectedObject hit.collider.gameObject;offset selectedObject.transform.position - transform.position;isHoldingObject true;}}// 如果当前有选中的物体并且手柄按钮仍然被按住if (isHoldingObject vrpnButton.ButtonHold){// 移动物体使其保持与手柄的相对位置selectedObject.transform.position transform.position offset;}// 如果手柄按钮被松开if (isHoldingObject vrpnButton.ButtonUp){// 放置物体isHoldingObject false;selectedObject null;}} }2. 考虑手柄的旋转处理 将选中物体与手柄作为整体同时增加重力响应与Game视图中的射线渲染 using UnityEngine; using UVRPN.Core;public class HandleMove : MonoBehaviour {public LayerMask targetLayer; // 目标物体所在的层public float rayLength 5f; // 射线的长度public float lineWidth 0.01f; // 线条宽度 private GameObject selectedObject; // 当前选中的物体private Vector3 originalLocalPosition; // 物体相对于手柄的初始局部位置private Quaternion originalLocalRotation; // 物体相对于手柄的初始局部旋转private VRPN_Button vrpnButton; // VRPN_Button 组件的引用private Rigidbody rigidbody; // 选中物体的刚体组件private LineRenderer lineRenderer; // Game视图中的射线渲染void Start(){vrpnButton GetComponentVRPN_Button();lineRenderer GetComponentLineRenderer();// 设置 LineRenderer 的宽度lineRenderer.startWidth lineWidth;lineRenderer.endWidth lineWidth;lineRenderer.enabled false;}void Update(){// 发射射线Ray ray new Ray(transform.position, -transform.forward);RaycastHit hit;// 如果射线击中了目标层上的物体if (Physics.Raycast(ray, out hit, rayLength, targetLayer)){Debug.DrawLine(ray.origin, hit.point, Color.red); // 绘制射线仅在 Scene 视图中可见// 启用 Line Renderer 并设置位置lineRenderer.enabled true;lineRenderer.SetPosition(0, ray.origin);lineRenderer.SetPosition(1, hit.point);// 检测手柄按钮是否被按下if (vrpnButton.ButtonDown !selectedObject){// 抓取物体selectedObject hit.collider.gameObject;selectedObject.transform.SetParent(transform, true); // 将物体设置为手柄的子对象// 禁用物理引擎响应rigidbody selectedObject.GetComponentRigidbody();if (rigidbody){rigidbody.isKinematic true;}// 记录物体相对于手柄的初始局部位置和旋转originalLocalPosition selectedObject.transform.localPosition;originalLocalRotation selectedObject.transform.localRotation;}}else{// 如果射线没有击中任何物体禁用 Line RendererlineRenderer.enabled false;}// 如果手柄按钮被松开if (vrpnButton.ButtonUp selectedObject){// 放置物体selectedObject.transform.SetParent(null); // 移除物体的父对象selectedObject.transform.position transform.TransformPoint(originalLocalPosition); // 重置物体的世界位置selectedObject.transform.rotation transform.rotation * originalLocalRotation; // 重置物体的世界旋转selectedObject null;// 启用物理引擎响应if (rigidbody){rigidbody.isKinematic false;}}} }3. 正确处理 VRPN 的坐标转换关系 坐标系转换的原理 已知动捕坐标系右手与 Unity 坐标系左手转动到同一视角将坐标系对齐如下 3.1 动捕 Y-UP 即两坐标系 X 轴反向。 3.2 动捕 Z-UP 即 Z 与 Y 对调。 注意转换的方式不止一种这里选择比较方便的处理方式。 3.3 解决坐标系转换问题 1.通过 VRPN 反转设置 若动捕 Y 轴向上 若动捕Z轴向上 不支持 2.通过修改 VRPN 脚本编辑 VRPN_NativeBridge.cs实现坐标系转换 若动捕 Y 轴向上 internal static Vector3 TrackerPos(string address, int channel) {return new Vector3(-(float)vrpnTrackerExtern(address, channel, 0, Time.frameCount),(float)vrpnTrackerExtern(address, channel, 1, Time.frameCount),(float)vrpnTrackerExtern(address, channel, 2, Time.frameCount)); }internal static Quaternion TrackerQuat(string address, int channel) {return new Quaternion(-(float)vrpnTrackerExtern(address, channel, 3, Time.frameCount),(float)vrpnTrackerExtern(address, channel, 4, Time.frameCount),(float)vrpnTrackerExtern(address, channel, 5, Time.frameCount),-(float)vrpnTrackerExtern(address, channel, 6, Time.frameCount)); }若动捕 Z 轴向上 internal static Vector3 TrackerPos(string address, int channel) {return new Vector3((float)vrpnTrackerExtern(address, channel, 1, Time.frameCount),(float)vrpnTrackerExtern(address, channel, 2, Time.frameCount),-(float)vrpnTrackerExtern(address, channel, 0, Time.frameCount)); }internal static Quaternion TrackerQuat(string address, int channel) {return new Quaternion((float)vrpnTrackerExtern(address, channel, 3, Time.frameCount),(float)vrpnTrackerExtern(address, channel, 5, Time.frameCount),(float)vrpnTrackerExtern(address, channel, 4, Time.frameCount),-(float)vrpnTrackerExtern(address, channel, 6, Time.frameCount)); }3.4 创建刚体时的朝向下面以Y轴向上为例进行讲解通用的处理方式 打开VR_box的空间交互场景 选中手柄按W键进行Move状态点击工具栏上的Toggle Tool Handle Rotation选择Local 观察确定场景中手柄道具的朝向此时手柄物体指向自身的Z轴负方向 编辑VRPN_Tracker的设置勾选local由于此物体为顶层物体无父对象其worldlocal, 这里通用处理 在动捕系统中放置实体手柄由于此时动捕Z轴与UnityZ轴世界坐标系重合朝向Z轴的负方向创建刚体 参考3.1坐标系转换的关系对vrpn参数进行设置其中position反转Xrotation反转Y与Z轴向反转一次左右手法则角度再反一次所以X的rotation不变 4. 使用说明 解压工程附件Unity_Joystick_Demo V1.0.zip打开 Assets-Scenes-VR_box.unity。运行动捕软件完成坐标系的标定与蓝牙手柄的连接并启用 VRPN选择刚体类型设置数据单位为米。在动捕软件中创建手柄对应的刚体其中手柄朝向参考 3.4。配置 VRPN_Tracker 与 VRPN_Button 组件设置正确的 Tracker 名称。运行 Unity 程序测试不同方向的移动与旋转是否正常按下手柄按键观察是否有打印输出。 思考题 若动捕坐标系如下其中 X 轴正方向指向显示器/墙面对应着 Unity 中手柄前方的交互场景如何处理转换关系 参考答案 手柄面向 X 轴正方向创建刚体同时数据处理如下 internal static Vector3 TrackerPos(string address, int channel) {return new Vector3((float)vrpnTrackerExtern(address, channel, 1, Time.frameCount),(float)vrpnTrackerExtern(address, channel, 2, Time.frameCount),-(float)vrpnTrackerExtern(address, channel, 0, Time.frameCount)); }internal static Quaternion TrackerQuat(string address, int channel) {return new Quaternion((float)vrpnTrackerExtern(address, channel, 4, Time.frameCount),(float)vrpnTrackerExtern(address, channel, 5, Time.frameCount),-(float)vrpnTrackerExtern(address, channel, 3, Time.frameCount),-(float)vrpnTrackerExtern(address, channel, 6, Time.frameCount)); }
http://www.hkea.cn/news/14516474/

相关文章:

  • 装修公司做网站有用吗摄影网站设计代码
  • 电商网站的多选菜单插件做好公司网站
  • 网站怎么做百度商桥网站搭建php打不开
  • 网站建设的目的和意义海淘科技上海网站设计
  • 宜昌便宜做网站网站 做内容分发资格
  • 电商网站排行榜西安最新公告
  • 空间站做网站什么版本外贸免费平台
  • 徐州做网站设计外贸大楼
  • 分析对手网站免费设计企业logo
  • 营销网站开发系统网站开发最新流程
  • 行业门户网站建站如何在电脑建设网站
  • 网站续费价格网页传奇哪个最好玩
  • 电商网站建设与运营方向核心关键词如何优化
  • 建好网站后访问中讯高科网站建设
  • 郑州做手机网站建设必知的网站
  • 公司网站建设外包赣州人才网官网登录
  • 网站建设公司株洲WordPress臃肿主题
  • 自建网站餐饮服务提供者应在通信主管部门备案后wordpress怎么改后台密码
  • asp简单的网站怎么做哪里有市场营销培训班
  • 扬州哪里做网站好网络购物系统
  • win2008 网站服务器搜狐网站网络营销怎么做
  • 重庆网站排名网站模块是什么
  • 企业做的网站开发费如何入帐科技让生活更美好作文500字
  • 云浮营销建站公司桂林 网站建设
  • 显示网站正在维护是什么情况国际战事最新消息
  • 网站建设需要用到的软件建筑公司取名参考
  • 网站域名哪里买建网站公司专业
  • 上海加盟网网站建设网站建设300元
  • 欧美网站与中国网站区别能做wordpress的网站
  • 如何做学校的网站设计html做网站自适应宽度