技术标签: 技术·VR 技术·Unity3D HTC 学习日记
这篇文章主要写的是通过手柄控制移动在场景中漫游。
在通过手柄控制移动时,我主要写了两个脚本一个ChildTransform.cs、Move.cs;
1、 ChildTransform这个脚本主要是为了获取头部Y轴方向的转动。以及头部在x、z轴方向的移动。将这个信息赋值给这个脚本绑定的对象身上。
2、 Move这个脚本主要是为了控制玩家的移动的,移动的方向是依据绑定ChildTransform这个脚本的transform信息。
这样就能实现,头盔转动控制移动的方向,手柄中touchPad的上、下、左、右控制移动的向前、向左、向右、向后移动。
操作步骤:
1、 首先我们需要先创建一个空对象,命名为moveDic。
2、 然后将脚本ChildTransform绑定在moveDic上。
3、 将Camera(head)赋值给ChildTransform的Same变量。
这个就能将Camera(head)的方向信息赋值给moveDic。
脚本
Movie.cs 有3个公共变量:
1、 Player:将 [Camera Rig]赋值给它。
2、 Dic:将moveDic赋值给它。
3、 Speed:主要是控制移动的速度。
using UnityEngine;
using System.Collections;
public class ChildTransform : MonoBehaviour
{
public Transform same;
void FixedUpdate()
{
transform.localEulerAngles = new Vector3(0, same.localEulerAngles.y, 0);
transform.localPosition = new Vector3(same.localPosition.x, 0, same.localPosition.z);
}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using HTC.UnityPlugin.Vive;
using HTC.UnityPlugin.Pointer3D;
public class Move : MonoBehaviour {
/// <summary>
/// 玩家
/// </summary>
public Transform player;
/// <summary>
/// 方向
/// </summary>
public Transform dic;
/// <summary>
/// 速度
/// </summary>
public float speed;
public GameObject targetObj = null;
private ReticlePoser rp;
void Awake()
{
rp = GameObject.Find ("VivePointers/Right/Reticle").GetComponent<ReticlePoser>();
}
// Update is called once per frame
void FixedUpdate () {
targetObj = rp.raycaster.FirstRaycastResult().gameObject;
//按下圆盘键
if (ViveInput.GetPress(HandRole.RightHand,ControllerButton.PadTouch))
{
Vector2 cc = ViveInput.GetPadTouchAxis(HandRole.RightHand);
float angle = VectorAngle(new Vector2(1, 0), cc);
//下
if (angle > 45 && angle < 135)
{
player.Translate(-dic.forward * Time.deltaTime * speed);
}
//上
else if (angle < -45 && angle > -135)
{
//Debug.Log("上");
player.Translate(dic.forward * Time.deltaTime * speed);
}
//左
else if ((angle < 180 && angle > 135) || (angle < -135 && angle > -180))
{
//Debug.Log("左");
player.Translate(-dic.right * Time.deltaTime * speed);
}
//右
else if ((angle > 0 && angle < 45) || (angle > -45 && angle < 0))
{
//Debug.Log("右");
player.Translate(dic.right * Time.deltaTime * speed);
}
}
if (ViveInput.GetPress(HandRole.LeftHand,ControllerButton.Pad)) {
Vector2 cc = ViveInput.GetPadTouchAxis(HandRole.LeftHand);
float angle = VectorAngle(new Vector2(1, 0), cc);
//下
if (angle > 45 && angle < 135)
{
player.Translate(-dic.up * Time.deltaTime * speed);
}
//上
else if (angle < -45 && angle > -135)
{
//Debug.Log("上");
player.Translate(dic.up * Time.deltaTime * speed);
}
}
}
// void OnTriggerEnter(Collider collider){
// Debug.Log("cube");
// }
// void OnCollisionEnter(){
// Debug.Log("cube");
// }
/// <summary>
/// 根据在圆盘才按下的位置,返回一个角度值
/// </summary>
/// <param name="from"></param>
/// <param name="to"></param>
/// <returns></returns>
float VectorAngle(Vector2 from, Vector2 to)
{
float angle;
Vector3 cross = Vector3.Cross(from, to);
angle = Vector2.Angle(from, to);
return cross.z > 0 ? -angle : angle;
}
}
文章浏览阅读3.8k次,点赞3次,收藏30次。本文详细分析并介绍了基于opencpu方案开打bc26 NB模组的流程,主要分为开发工具套件的使用以及代码分析。_bc26
文章浏览阅读447次。C/C++Linux服务器高级架构师的课程到2022目前已经迭代到12代了,像之前小编也总结过,但是课程每期都有做一定的更新,也是为了更好的完善课程跟上目前互联网大厂的岗位技术需求,之前课程里面也包含了一些小的分支,其中就有音视频开发、Linux内核开发、DPDK、golang等等一些程序员所需要的硬核技术。今天总结分析是2022年最新的课程体系。_202212.c.c.c
文章浏览阅读1.2k次,点赞10次,收藏13次。*单片机设计介绍,基于单片机12864的出租车计价器设计。
文章浏览阅读2.7k次,点赞2次,收藏33次。使用GMap.Net控件从零开始搭建一个GIS开发小框架_greatmaps
文章浏览阅读344次。模板就是建立通用的模具,大大提高复用性。_c++泛型编程编译
文章浏览阅读477次,点赞14次,收藏4次。运算符重载实际上是一种特殊形式的C++多态。重载运算符时,需要用到被称为运算符函数的特殊函数形式。运算符函数的函数名比较特殊,可以认为是operator关键字和运算符的组合。运算符函数也是一个函数,具有形参和返回值。运算符函数的定义如下:返回类型 operator 运算符符号(参数列表)函数体。_重载自增
文章浏览阅读1.3k次,点赞47次,收藏44次。只对写操作进行加锁,加锁的方式仍然是 synchronized ,但是不是锁整个对象,而是“锁桶”,每一个链表的头节点作为锁对象,大大降低了锁冲突的概率。由于哈希表是由数组与链表或者红黑树组成的,数组的长度很长,因此相对链表的长度来说,链表的长度就很短了,所以在多线程中,对数组中的某一个链表大概率是不会冲突的,因此即使每一个链表都上锁了,这个锁也大概率是偏向锁,大概率是没有加锁和解锁的开销。扩容期间,新老数组同时存在。是一个线程安全的集合类,所有对 HashTable 的操作都是同步的,即线程安全的。_java保存线程的集合
文章浏览阅读1.4k次。图解翻译和详解深度学习GAN(含项目完整代码)_gan data flow
文章浏览阅读261次。文章版权所有 Jusin Hao(luckyfriends) ,支持原创,转载请注明@echo offcd c:\md Oracle"C:\Program Files (x86)\WinRAR\winrar.exe" x C:\win64_11gR1_database.zip C:\Oraclecopy /y c:\refhost.xml c:\Oracle\database\stage\prer..._oracle 11g windows 静默安装
文章浏览阅读1.6k次,点赞2次,收藏5次。与深度测试,透明度测试类似,决定一个片元是否被扔掉。深度测试的比较数据在深度缓冲中,透明度测试的比较对象是颜色缓冲中的值,而模版测试的比较数据在Stencil中,并且模板测试要先于深度测试与透明度测试,在fragment函数之前就会执行模板测试。参数描述Ref就是参考值,当参数允许赋值时,会把参考值赋给当前像素ReadMask对当前参考值和已有值进行mask操作,默认值255,一般不用WriteMask写入Mask操作,默认值255,一般不用Comp比较方法。CompAlways。......_lightmode" shader
文章浏览阅读497次。第一步:编写shell脚本,要求输出结果为数值。如下统计磁盘io /读写,队列,繁忙率等#cat /opt/zabbix/list.sh# !/bin/bashdevice=$1 #监控那个磁盘:sda,sdbaction=$2 #监控项:read,write,queue还是utilstr=`iostat -d -x | grep 'util'`#str2=`echo "$str" | aw..._zabbix 脚本参数
文章浏览阅读2.8k次。用pandas处理.csv文件时,有时我们希望保存的.csv文件没有表头,于是我去看了DataFrame.to_csv的document。发现只需要再添加header=None这个参数就行了(默认是True),下面贴上document:DataFrame.to_csv(path_or_buf=None, sep=', ', na_rep='', float_format=None, columns..._pandas 写csv 表头