不知道怎么开发VR游戏?Unity5.3官方VR教程重磅登场-系列3 VR中的交互方式

2023-10-26

不知道怎么开发VR游戏?Unity5.3官方VR教程重磅登场-系列3 VR中的交互方式

王寒  · 4 个月前
https://zhuanlan.zhihu.com/p/20505470

概览:

在VR项目中,我们需要在用户”凝视“某个物体时将其激活。在VRSamples中,我们构建了一个简单的,可拓展的轻度系统,让用户跟场景中的物体进行交互。其中包含了三个主要的脚本文件:VREyeRaycaster,VRInput和VRInteractiveItem,下面将对这三个重要的类进行简要的介绍。相关的源代码也做了注释。

VREyeRaycaster

该脚本需要和Main Camera关联。在每次调用Update()时,该脚本都会使用Physics.Raycast来投射一条射线,以确认该射线是否命中任何collider(碰撞体)。使用该脚本还可以排除特定的Unity - Manual: Layers-在某些场景中,我们可能为了性能考虑,把所有的可交互对象移到一个单独的层。

如果某个碰撞体被射线命中,那么该脚本将尝试在GameObject上找到一个VRInteractiveItem组件。

C#脚本:

VRInteractiveItem interactible = hit.collider.GetComponent<VRInteractiveItem>();

//attempt to get the VRInteractiveItem on the hit object

从这里我们就可以判断用户究竟在”凝视“哪个物体,或是停止”凝视“某个物体。如果用户开始或停止”凝视“某个物体,那么我们就可以进行一些处理,比如调用一个方法。

VRInput

VRInput是个简单的类,可以判断用户在GearVR上(或是使用DK2时在PC上)所进行的一些简单操作,比如滑动、触碰、或双触。

我们可以直接在VRInput上订阅事件:

C#脚本:

public event Action<SwipeDirection> OnSwipe;

// Called every frame passing in the swipe, including if there is no swipe.

public event Action OnClick;

// Called when Fire1 is released and it's not a double click.

public event Action OnDown;

// Called when Fire1 is pressed.

public event Action OnUp;

// Called when Fire1 is released.

public event Action OnDoubleClick;

// Called when a double click is detected.

public event Action OnCancel;

// Called when Cancel is pressed.

关于订阅事件的更多信息,请参考这里。Unity - Events

VRInteractiveItem

我们可以把该组件添加到任何希望在VR场景中进行交互的GameObject上,在该物体上需要绑定一个碰撞体。

对此我们可以选择订阅六种不同的事件:

C#脚本:

public event Action OnOver;

// Called when the gaze moves over this object

public event Action OnOut;

// Called when the gaze leaves this object

public event Action OnClick;

// Called when click input is detected whilst the gaze is over this object.

public event Action OnDoubleClick;

// Called when double click input is detected whilst the gaze is over this object.

public event Action OnUp;

// Called when Fire1 is released whilst the gaze is over this object.

public event Action OnDown;

// Called when Fire1 is pressed whilst the gaze is over this object.

此外还有一个布尔值用于判断用户是否”凝视“在当前物体上?

C#脚本:

public bool IsOver

{

get{ return m_IsOver; } // Is the gaze currently over this object?

}

我们也可以创建自己的脚本对以上事件作出响应。下面是一个简单的示例:

C#脚本:

using UnityEngine;

using VRStandardAssets.Utils;

namespace VRStandardAssets.Examples

{

// This script is a simple example of how an interactive item can

// be used to change things on gameobjects by handling events.

public class ExampleInteractiveItem : MonoBehaviour

{

[SerializeField] private Material m_NormalMaterial;

[SerializeField] private Material m_OverMaterial;

[SerializeField] private Material m_ClickedMaterial;

[SerializeField] private Material m_DoubleClickedMaterial;

[SerializeField] private VRInteractiveItem m_InteractiveItem;

[SerializeField] private Renderer m_Renderer;

private void Awake ()

{

m_Renderer.material = m_NormalMaterial;

}

如果想看到实际的示例,不妨看看VRSampleScens/Scens/Examples/的InteractiveItem场景。

SelectionRadial和SelectionSlider

我们同时利用了radial选择条(SelectionRadial),以及选择滑动条(SelectionSlider),这样用户就可以按住Fire1来确认某个交互:

当按住输入键时,选择条会进行填充,并在填充完整后分发OnSelectionComplete或OnBarFilled事件。关于此部分的代码,可以在SelectionRadial.cs和SelectionSlider.cs中找到,并进行了详细的注释。

在VR的世界里,从用户交互的角度看,用户需要时刻知道自己在做什么,而且可以掌控一切。通过这种“held input”的确认输入方式,可以确保用户不会出现误操作。

VR Sample项目中的交互示例

现在让我们来一起看看VR Sample项目中的部分交互示例。我们将提到每个场景中所使用的交互方式,以及具体实现的方式。

Menu 场景中的交互

每个menu场景都包含了几个组件,其中我们需要重点关注的是MenuButton,VRInteractiveItem和Mesh Collider。

MenuButton组件订阅了VRInteractiveItem组件上的OnOver和OnOut事件,这样当十字准星移到menu上时,selection radial会出现。当用户的实现离开菜单选项时,selection radial会消失。而当selection radial可见,且用户按住Fire1键时,则radial会自动填充:

该类还订阅了OnSelectionRadial的OnSelectionComplete事件,这样当radial被填充满的时候,会调用HandleSelectionComplete。该方法的作用是让摄像机淡出,并调用所选的关卡。

C#脚本:

private void OnEnable ()

{

m_InteractiveItem.OnOver += HandleOver;

m_InteractiveItem.OnOut += HandleOut;

m_SelectionRadial.OnSelectionComplete += HandleSelectionComplete;

}

private void OnDisable ()

{

m_InteractiveItem.OnOver -= HandleOver;

m_InteractiveItem.OnOut -= HandleOut;

m_SelectionRadial.OnSelectionComplete -= HandleSelectionComplete;

}

private void HandleOver()

{

// When the user looks at the rendering of the scene, show the radial.

m_SelectionRadial.Show();

m_GazeOver = true;

}

private void HandleOut()

{

// When the user looks away from the rendering of the scene, hide the radial.

m_SelectionRadial.Hide();

m_GazeOver = false;

}

private void HandleSelectionComplete()

{

// If the user is looking at the rendering of the scene when the radial's selection finishes, activate the button.

if(m_GazeOver)

StartCoroutine (ActivateButton());

}

private IEnumerator ActivateButton()

{

// If the camera is already fading, ignore.

if (m_CameraFade.IsFading)

yield break;

// If anything is subscribed to the OnButtonSelected event, call it.

if (OnButtonSelected != null)

OnButtonSelected(this);

// Wait for the camera to fade out.

yield return StartCoroutine(m_CameraFade.BeginFadeOut(true));

// Load the level.

SceneManager.LoadScene(m_SceneToLoad, LoadSceneMode.Single);

}

让我们来看看Selection Radial的部分示例,注意截图中间的粉色元素:

Reticle only

当用户“凝视”菜单选项时,空白的Selection Radial可见。

Selection Radial 填充(当用户“凝视”菜单选项,且按下fire1输入键)

在整个示例项目中,我们尝试用同样的风格,也就是使用bar和radial以固定的速度进行填充。在此建议大家在开发自己的VR项目时注意到这一点,因为交互设计中的连贯性对用户很重要,特别是对于VR这种新媒介。

Maze场景中的交互

Maze(迷宫)游戏中提供了一个桌面式的交互示例,其中我们可以指引游戏角色到出口,并避免触发炮塔。

在选择角色的目的地时,会出现一个目的地标记,同时还会显示一个角色的路径。玩家可以通过在触摸板上使用swipe,按下方向键,或是使用游戏操纵杆上的左键来旋转视图。

在MazeFloor游戏对象上关联了MeshCollider和VRInteractiveItem,从而允许在VR场景中进行交互:

MazeCourse 游戏对象是一个parent对象,其中包含了MazeFloor和MazeWalls GameObjects,这两个对象依次包含了迷宫布局中的几何信息。

MazeCourse关联了一个MazeTargetSetting脚本,其中包含了对MazeFloor对象上VRInteractiveItem组件的引用。

MazeTargetSetting订阅了VRInteractiveItem上的OnDoubleClick事件,随后会分发OnTargetSet事件。该事件将把十字准星的Transform作为参数:

C#脚本:

public event Action<Transform> OnTargetSet;

// This is triggered when a destination is set.

private void OnEnable()

{

m_InteractiveItem.OnDoubleClick += HandleDoubleClick;

}

private void OnDisable()

{

m_InteractiveItem.OnDoubleClick -= HandleDoubleClick;

}

private void HandleDoubleClick()

{

// If target setting is active and there are subscribers to OnTargetSet, call it.

if (m_Active && OnTargetSet != null)

OnTargetSet (m_Reticle.ReticleTransform);

}

MazeCharacter游戏对象上的Player组件和MazeDestinationMarketGUI游戏对象上的DestinationMarker组件都会订阅该事件,并作出相应的响应。

游戏角色可以使用Nav Mesh systems在迷宫中进行路径判断。Player组件使用HandleSetTarget函数来判断Nav Mesh Agent到十字准星间的方向,并更新Agent的轨迹-游戏角色路径的视觉渲染。

C#脚本:

private void HandleSetTarget(Transform target)

{

// If the game isn't over set the destination of the AI controlling the character and the trail showing its path.

if (m_IsGameOver)

return;

m_AiCharacter.SetTarget(target.position);

m_AgentTrail.SetDestination();

}

DestinationMarker可以将标记移动到Reticle的Transform位置:

C#脚本:

private void HandleTargetSet(Transform target)

{

// When the target is set show the marker.

Show();

// Set the marker's position to the target position.

transform.position = target.position;

// Play the audio.

m_MarkerMoveAudio.Play();

// Play the animation on whichever layer it is on, with no time offset.

m_Animator.Play(m_HashMazeNavMarkerAnimState, -1, 0.0f);

}

在下图中可以看到reticle,目的地标记,玩家和轨迹。

迷宫中的切换开关也是在VR中和物体进行交互的示例,其中用到了Collider,以及VRInteractiveItem,和SelectionSlider三个类。

正如上图中显示的,和其它交互对象一起,SelectionSlider脚本会监听由VRInteractiveItem和VRInput所分发的事件。

C#脚本:

private void OnEnable ()

{

m_VRInput.OnDown += HandleDown;

m_VRInput.OnUp += HandleUp;

m_InteractiveItem.OnOver += HandleOver;

m_InteractiveItem.OnOut += HandleOut;

}

Flyer场景中的交互

Flyer场景是一个计时”无尽飞行”游戏,在其中玩家可以通过四处看来引导飞船的方向,并使用Fire1输入键进行射击,通过击中陨石或是引导飞船穿越空中的门来得分,跟Pilotwings或Starfox这两款游戏有点类似。

在交互方面,Flyer使用了更简单的方式,也就是让FlyerLaserController订阅VRInput的OnDown事件,从而发射激光。

C#脚本:

private void OnEnable()

{

m_VRInput.OnDown += HandleDown;

}

private void HandleDown()

{

// If the game isn't running return.

if (!m_GameController.IsGameRunning)

return;

// Fire laser from each position.

SpawnLaser(m_LaserSpawnPosLeft);

SpawnLaser(m_LaserSpawnPosRight);

}

Shooter180和Shooter360场景中的交互(Target Gallery/ Target Arena)。

在VR Samples包含了两个射击游戏,其中一个是回廊射击游戏,玩家在180度视角的走廊中对潜在目标射击。另外还有一个竞技场射击游戏,玩家被类似X战警场景的潜在目标包围。

这两款游戏中的每个目标对象都有一个Collider,VRInteractiveItem和ShootingTarget。

ShootingTarget组件订阅了VRInteractiveItem的OnDown事件,以判断目标是否被击中。该方法适用于瞬间命中(比如激光枪这种)的设定,如果要展示子弹时间,我们就需要考虑其它解决方案了。

现在我们应该对基本的VR交互组件有了大概的印象,包括任何在VR Samples项目中具体使用这些组件。现在让我们来看看VR Samples项目中如何使用gaze(凝视)和reticles(十字星)。

GAZE(凝视)

在VR应用中判断用户正在看什么很重要,可能是用于判断用户和游戏对象的交互,或是触发一个动画,也可能是向目标发射子弹。我们将VR中“看”这个动作定义为gaze(凝视),而在后续的教程中我们将频繁使用这个词。

考虑到目前大多数HMD头戴设备还不支持眼部追踪,因此我们只能估计用户的gaze(凝视)。透镜的扭曲意味着用户正看着正前方,有一个简单的解决方案。正如在概览中提到的,我们只需要从摄像机的中心发射一条射线,然后找到这条射线所碰撞的物体即可。当然,这就意味着所有要被碰撞(或是需要通过“凝视”进行交互)的对象都必须关联一个Collider组件。

Reticle(十字准星)

十字准星用于辅助标记用户视野的中心。十字准星的样式可能是简单的点,也可能是一个十字准线,具体形式取决于项目需求。

在传统的3D游戏中,十字准星被设置为空间中的固定点,比如通常是屏幕的中央。但是在VR中使用十字准星变得非常复杂:当用户在VR环境中四处观望时,双眼将汇集在靠近摄像机的物体上。如果十字准星处在一个固定的位置,那么用户会看到两个准星:我们在现实世界里面可以轻易模仿这种效果。把某个手指放在眼睛前面,然后聚焦到近处和远处的物体上。当我们聚焦在这个手指上时,就会看到两个背景,反之亦然。这就是传说中的Diplopia 现象。

为了避免用户在查看周围环境和注视不同距离的物体时看到两个准星,我们需要将准星放到3D空间的同一个点,也就是用户所关注对象的表面。

将准星放在空间的这个点意味着从远处看准星将非常小,当靠近时会变大。为了让准星的大小不随距离发生变化,我们需要根据它到摄像机的距离对其进行缩放。

为了说明这一点,我们从Examples/Reticle场景中找了一些例子,展示了处于不同距离和比例的准星。

准星放置在靠近摄像机的物体上:

准星放置在稍远的物体上:

准星放置在远处:


根据所处的位置和自身比例,用户在任何距离上看到的准星大小都是相同的。

如果没有击中任何对象,那么我们只需把准星放到一个预设的距离上。在室外环境中,可能会放在摄像机的Far clip plane前面,在室内场景中可能会近得多。

将十字准星渲染到其它游戏对象的表面

如果十字准星恰好和某个对象的位置相同,那么准星可能会嵌入到临近的对象中。

为了解决这个问题,我们需要确保将准星渲染到场景中所有对象的前面。在VR Samples中,我们提供了一个shader,基于Unity现有的名为UIOverlay.shader的”UI/Unlit/Text” shader。在选择某个材质的shader时,可以在”UI/Overlay”中找到。

这个shader对UI 元素和文本都适用,会在场景中其它物体的前面绘制。

将准星和场景中的游戏对象对齐

我们希望准星的旋转方向和它所命中的对象的法线相匹配。通过RaycastHit.normal就可以实现这一点,以下是具体的实现代码:

C#脚本:

public void SetPosition (RaycastHit hit)

{

m_ReticleTransform.position = hit.point;

m_ReticleTransform.localScale = m_OriginalScale * hit.distance;

// If the reticle should use the normal of what has been hit...

if (m_UseNormal)

// ... set it's rotation based on it's forward vector facing along the normal.

m_ReticleTransform.rotation = Quaternion.FromToRotation (Vector3.forward, hit.normal);

else

// However if it isn't using the normal then it's local rotation should be as it was originally.

m_ReticleTransform.localRotation = m_OriginalRotation;

}

我们可以在Maze场景中看到这个action。

下图展示了准星如何匹配墙壁的法线:

下图展示了准星如何匹配地板的法线:

我们还提供了一个示例的Reticle脚本。该脚本可以跟VREyeRaycaster一起适用,从而将准星放置到场景的正确位置,并且可以选择跟所命中的对象法线帖齐。

以上内容都可以在VRSampleScens/Scens/Examples/中看到。

在VR项目中头部的旋转和位置

在头戴设备中跟踪头部的旋转和位置可以用沉浸式的体验来感受周围环境,但同时也可以让对象根据这些数值所相应的相应。

为了获取这些数值我们需要用到VR.InputTracking类,并指定我们要访问的VRNode。为了获取头部的旋转,我们会希望用到VRNode.Head,而不是两只眼睛。想了解更多的信息,可以参考Getting Started with VR Development一文中的Camera Nodes。

使用头部旋转作为输入方式的可能应用是精细旋转菜单或是其它对象。在VRSampleScenes/Examples/Rotation场景中可以看到这一点的示例。

下面是ExampleRotation的脚本:

C#脚本:

// Store the Euler rotation of the gameobject.

var eulerRotation = transform.rotation.eulerAngles;

// Set the rotation to be the same as the user's in the y axis.

eulerRotation.x = 0;

eulerRotation.z = 0;

eulerRotation.y = InputTracking.GetLocalRotation(VRNode.Head).eulerAngles.y;

下面的图展示了游戏对象如何根据用户所注视的位置来进行旋转:

在Flyer游戏场景中,我们将看到太空飞船基于头部的旋转来调整自身位置,具体参考FlyerMovementController:

C#脚本:

Quaternion headRotation = InputTracking.GetLocalRotation (VRNode.Head);

m_TargetMarker.position = m_Camera.position + (headRotation * Vector3.forward) * m_DistanceFromCamera;


在VR游戏中使用触摸板和键盘进行交互


Gear VR在头戴设备的侧边配备了一个触摸板。Unity把这个触摸板当做鼠标来使用,所以我们可以使用以下方法:

Unity - Scripting API: Input.mousePosition

Unity - Scripting API: Input.GetMouseButtonDown

Unity - Scripting API: Input.GetMouseButtonUp

在使用Gear VR时,开发者可能会希望从触摸板中获取swipe数据。我们提供了一个名为VRInput的示例脚本,可以处理swipe,触碰和双触。此外它还支持方向键和键盘上的左Ctrl键(在Unity中的默认输入术语是Fire1),或者是鼠标上的左键,以此来处罚swipe和触摸。

在Unity Editor中,我们可能会希望使用DK2来测试Gear VR的内容。因为目前暂时无法直接从Unity直接关联到Gear VR进行测试。考虑到Gear VR的触摸板作用跟鼠标类似,我们可以考虑使用鼠标来模拟输入。当用户佩戴HMD设备时操控键盘会更容易,因此VRInput同时也会讲方向键操作处理成swipe,将Left-Ctrl(Fire1)处理成触碰。

在使用游戏手柄时,左侧的stick可以用作swipe,其中的某个按键可以用作触碰。

关于如何处理swipe,可以参考VRSampleScenes/Scenes/Examples/Touchpad

以下是ExampleTouchpad脚本,其中根据swipe的方向将AddTorque方法作用于一个刚体,从而让对象旋转。

C#脚本:

using UnityEngine;

using VRStandardAssets.Utils;

namespace VRStandardAssets.Examples

{

// This script shows a simple example of how

// swipe controls can be handled.

public class ExampleTouchpad : MonoBehaviour

{

[SerializeField] private float m_Torque = 10f;

[SerializeField] private VRInput m_VRInput;

[SerializeField] private Rigidbody m_Rigidbody;

private void OnEnable()

{

m_VRInput.OnSwipe += HandleSwipe;

}

private void OnDisable()

{

m_VRInput.OnSwipe -= HandleSwipe;

}

//Handle the swipe events by applying AddTorque to the Ridigbody

private void HandleSwipe(VRInput.SwipeDirection swipeDirection)

{

switch (swipeDirection)

{

case VRInput.SwipeDirection.NONE:

break;

case VRInput.SwipeDirection.UP:

m_Rigidbody.AddTorque(Vector3.right * m_Torque);

break;

case VRInput.SwipeDirection.DOWN:

m_Rigidbody.AddTorque(-Vector3.right * m_Torque);

break;

case VRInput.SwipeDirection.LEFT:

m_Rigidbody.AddTorque(Vector3.up * m_Torque);

break;

case VRInput.SwipeDirection.RIGHT:

m_Rigidbody.AddTorque(-Vector3.up * m_Torque);

break;

}

}

}

}

VR Samples项目中的VRInput示例

正如上面所提到的,我们所有的示例游戏都使用VRInput来处理触摸屏和键盘的输入。Maze游戏中的摄像机也会对swipe作出响应:

Maze

在这个场景中,CameraOrbit对swipe进行监听,从而允许对视点进行调整:

C#脚本:

private void OnEnable ()

{

m_VrInput.OnSwipe += HandleSwipe;

}

private void HandleSwipe(VRInput.SwipeDirection swipeDirection)

{

// If the game isn't playing or the camera is fading, return and don't handle the swipe.

if (!m_MazeGameController.Playing)

return;

if (m_CameraFade.IsFading)

return;

// Otherwise start rotating the camera with either a positive or negative increment.

switch (swipeDirection)

{

case VRInput.SwipeDirection.LEFT:

StartCoroutine(RotateCamera(m_RotationIncrement));

break;

case VRInput.SwipeDirection.RIGHT:

StartCoroutine(RotateCamera(-m_RotationIncrement));

break;

}

}

如果想了解为什么场景中的摄像机按照某个轨道运行,而不是旋转迷宫本身,可以参考Unity - Movement in VR这篇文章。

在看完本文后,我们应该对VR Sample场景中的基本交互有更深入的理解。虽然还有其它方式来实现VR交互,但这种方法是最简单易行的。在下一篇文章中,我们将讨论不同类型的VR用户界面。如果在学习中有任何问题,可以到Virtual Reality中参与讨论。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

不知道怎么开发VR游戏?Unity5.3官方VR教程重磅登场-系列3 VR中的交互方式 的相关文章

  • Unity查找物体方法的详细对比

    Unity查找物体方法的详细对比 我们开发中常用的查找物体的方法有 GameObject Find transform Find FindGameObjectWithTag FindGameObjectsWithTag FindObject
  • 【Unity插件】最多的插件合集

    一 前言 最近整理了一下文章 发现我分享了很多的插件 但是如果要查找某一款插件 还需要去搜索才能找到 很不方面 就想要将写过的所有的插件分享也好 教程也好 做一个汇总 然后这篇文章还会不断的更新 在有新的插件之后 熟悉我的人都知道 我对插件
  • 虚拟现实期末考试

    考点 考试分比 考试题型单项选择题40 名词解释题10 简答题20 程序设计题8 综合题12 材料分析题10 等 选择题 名词解释 VR 虚拟现实技术 英文名称 Virtual Reality 缩写为VR 是20世纪发展起来的一项全新的实用
  • 调用关卡蓝图上的接口函数

    本片博客实现的是不同蓝图之间用接口实现通信 下面用附上新建蓝图接口的大体步骤和实现的蓝图逻辑 新建蓝图接口 在蓝图接口里面新建函数 在关卡蓝图里面实现函数 如下图所示 然后在控件蓝图里面调用该接口 具体实现如下图
  • UnityVR--PoolManager--对象池1

    本篇中使用的API gameObject CompareTag 标签 UnityEvent 事件管理 ObjectPool
  • 使用Unity3D开发一款VR弹球游戏

    作者简介 沈庆阳 JackFlynn 拥有多年Unity3D开发经验 于2014年接触并开发VR应用 现泰然网虚拟现实教程组核心成员 撰写了 虚拟现实游戏开发 系列教程 开发VR游戏首先要选择一个合适的平台 目前可供选择的平台不多 Goog
  • 如何运用krpano生成第一全景项目

    使用droplet制作 生成一个全景 下载好krpano包后 解压文件夹 可以看到文件夹下有诸多文件 这时打开全景图片 拖入 droplet bat 文件 马上立刻就生成一个全景项目文件了 打开新生成的文件夹 打开tour html文件 用
  • 巴比特

    摘要 近日 据路透社报道 三位知情人士称 腾讯控股正在与脸书母公司Meta Platforms Inc Nasdaq META 就在中国销售Meta Quest系列虚拟现实头显进行谈判 路透社援引消息人士称 腾讯与Meta之间的谈判从去年开
  • Unity3D如何开发最简单的VR游戏 vrPlus(神之眼)

    VR是一种可创建和体验虚拟世界 Virtual World 的计算机系统 是一种可以创建和体验虚拟世界的计算机仿真系统 它利用计算机生成一种模拟环境 是一种多源信息融合的交互式三维动态视景和实体行为的系统仿真使用户沉浸到该环境中 作为一个u
  • 【Unity VR开发】VRTK 3.3.0 配置与基本使用

    VRTK3 3 开发日志 2021 11 16更新 半年前第一次接触VR开发 看B站Siki学院的视频做的笔记 今天整理一下 以供没接触过VR开发的人来学习 有些地方没有配图 但个人认为影响不大 按文字说明一步步来操作还是没问题的 笔记参考
  • “元宇宙”,究竟离我们有多远?(下)

    目录 引言 由 Z世代 引入 元宇宙 1 黑客帝国 究竟什么才是真实的世界 1 1 故事背景 1 2 矩阵 Matrix 矩阵计算与AI革命 1 3 D j vu 1 4 红蓝药丸 1 5 绿色代码雨 附源码 1 6 元宇宙 2 专访 时隔
  • 用VRTK4.0如何实现与UI交互(保姆级别教程)

    1 导入Tilia UnityUI master包 点击下面的链接直接跳到这个界面studentutu Tilia UnityUI Tilia package for VRTK 4 featuring support for Unity U
  • UnityVR--机械臂场景11-简单流水线应用3

    目录 一 前言 二 设置一个定时器 三 添加机械臂事件 四 机械臂控制函数OnArmCtrl 五 定义上面的3个机械臂移动方法 六 机械臂各关节转动控制 七 场景实现 八 完整代码 一 前言 上一篇使用了DoTween插件 并且改写了事件的
  • 广州华锐互动:利用VR复原文化遗址,沉浸式体验历史文物古迹的魅力

    在过去的几十年里 科技发展飞速 为我们打开了无数新的视角和可能性 其中 虚拟现实 Virtual Reality 简称VR 技术的崭新应用 为我们提供了一种全新的 近乎身临其境的体验历史的方式 本文将重点探讨VR技术在复原历史古迹方面的应用
  • PicoNeo3开发VR——小白教程

    不断更新中 欢迎大佬们来指导 纠错 导入PicoVRSDK 1 新创一个Unity工程 Unity版本最好选择2019 4以上版本 以及需配置好安卓环境 然后导入官方picoVRSDK 2 渲染设置 Graphics APIs暂不支持Vul
  • “元宇宙”既是机遇也是挑战

    一次性看懂元宇宙 是开疆拓土还是新一轮割韭菜 众所周知 随着AI VR AR MR XR 区块链 云计算 物联网 数字孪生 量子技术 5G技术等新兴技术的快速发展 推动刚刚过去的2021年成为元宇宙元年 先是3月Robolox上市 开启了元
  • unity 使用vrtk4的插件 打包htv vive VR客户端包,手柄不生效

    背景 目的 u3d使用vrtk开发pico应用 vrtk是为了到时候无缝衔接后续要买的htc vive pro 2 先导入了tilia importer 也就是vrtk4 0 根据教程模块化使用功能 和pico官网下的 PICO Unity
  • Python 和 A-frame实现从图像创建 3D 模型--附完整示例代码

    介绍 虚拟现实是指由计算机生成的模拟 允许用户使用特殊耳机进行交互 简而言之 它是由计算机创建的另类现实 而耳机可以让人们沉浸在该现实中 根据 Allied Market Research 的数据 到 2026 年 VR 内容创作市场将达到
  • 元宇宙3d展厅全景导览系统为现代展会的举办带来了全新的可能性和机遇。

    3D元宇宙展会搭建平台的亮点 随着科技的不断进步 3D元宇宙展会搭建平台已经成为了现代展会的新趋势 这种全新的展会形式不仅给人们带来了前所未有的视觉体验 还具备许多亮点和优势 让展会的举办更加高效 便捷和创新 一 突破时空限制 3D元宇宙展
  • 母猪智慧养殖VR虚拟互动教学给予学生充分的自主性和创新-深圳华锐视点

    为了保障养殖场生物安全 避免疫情传播 学生开展育肥猪养殖培训 多以参观为主 在一对多的模式下被动了解生产过程 解决实训难的问题 基于元宇宙平台进行育肥猪养殖实训 开启新时代养殖培训领域的新篇章 基于元宇宙进行育肥猪养殖实训 学生可以通过软件

随机推荐

  • 软件工程导论第六版 第五章 总体设计知识点总结

    目录 总体设计概述 目的 任务 设计过程 设计原理 什么是模块 什么是模块化 模块化的优点 模块化和软件成本 逐步求精 什么是逐步求精 Miller法则 抽象 信息隐藏和局部化 什么是信息隐藏 信息隐藏的优点 模块独立 耦合 内聚 内聚程度
  • XML基础入门:关于XML建模

    今天我给大家分享关于XML建模的基础 目录 今天我给大家分享关于XML建模的基础 一 什么是XML建模 就是将XML配置文件以模型的方式 进行输出操作 二 如何将XML建模 步骤 实例对象模型 1 ForwardModel 2 Action
  • 微信小程序支付

    微信小程序支付接口需要的参数timeStamp nonceStr package signType paySign openid是在登录时获取的 只需要调取token里的内容就可以了 点击事件通过cardid来判断与传值
  • 在blender中使用python脚本批量复制平移生成模型

    本案例需求 从基本的建筑单元按照字形平面布局生成综合建筑体 先在blender中用手工制作好一个建筑单元 名称定为 cube 然后在blender中打开一个 Text Editor 编辑窗口 在里面写入python脚本 import bpy
  • ImportError: /usr/lib/x86_64-linux-gnu/libstdc++.so.6: version `GLIBCXX_3.4.29‘ not found

    报错内容 ImportError usr lib x86 64 linux gnu libstdc so 6 version GLIBCXX 3 4 29 not found required by home lab118 anaconda
  • 图解SSL/TLS协议

    http www ruanyifeng com blog 2014 09 illustration ssl html 一 SSL协议的握手过程 开始加密通信之前 客户端和服务器首先必须建立连接和交换参数 这个过程叫做握手 handshake
  • 联想小新潮7000安装deepin 系统

    deepin 是国内比较好的开源linux操作系统 安装也比较方便 1 下载ISO镜像文件和深度启动盘制作工具 deepin官网下载ISO 启动盘制作工具下载 2 按照官网的指导 一步一步安装系统 官网指导安装过程 win10进入bios的
  • STL-set-用法

    set集合容器实现了红黑树 Red Black Tree 的平衡二叉检索树的的数据结构 在插入元素时 它会自动调整二叉树的排列 把该元素放到适当的位置 以确保每个子树根节点的键值大于左子树所有节点的键值 而小于右子树所有节点的键值 另外 还
  • 益智小游戏点灯(迷你世界lua脚本)

    点灯游戏是一个十分有趣的智力游戏 有一行N行N列的灯 开始时全部是灭的 当你点击其中一盏灯时他的上下左右 若存在的话 状态全部改变 现在要求你在限定的时间内以最少地步数 将全部的灯点亮 点灯益智游戏 作者 韩永旗 迷你号 247312290
  • Java基础读取本地txt文件

    public class TxtTest public static String txt2String File file StringBuilder result new StringBuilder try BufferedReader
  • python中冒号(:)的作用

    python中冒号 的作用 一开始接触python代码的时候冒号这个存在一直困扰了我很久 说一下我对冒号的理解 冒号 表示的就是一个整体 冒号出现在哪里就代表这个位置对整体 第一 作为整体用于输出 如在plt scatter x 0 x 1
  • 【Leetcode】142. 环形链表 II

    题目描述 142 环形链表 II 给定一个链表 返回链表开始入环的第一个节点 如果链表无环 则返回 null 为了表示给定链表中的环 我们使用整数 pos 来表示链表尾连接到链表中的位置 索引从 0 开始 如果 pos 是 1 则在该链表中
  • 海明校验码

    1 海明码的特点 其中m表示数据位的位数 k表示海明校验码的位数 k位海明校验码一共可以表示种校验信息结果 其中有一种要用来表示没有出错的情况 则其余还剩 1种结果 为了使校验结果可以指出任一位出错的位置 则需要满足以上不等式 2 举例说明
  • 树莓派搭建K8S集群

    最近学习k8s知识 想用树莓派搭建集群 在网找了不少 就发现一篇文章可以搭建成功香橙派4和树莓派4B构建K8S集群实践之一 K8S安装 参考了不少 这里主要记录下遇到的一些问题 参考的文章 是香橙派和树莓派 我这里全是树莓派 所以是树莓派路
  • js判断Android、iOS或浏览器

    第一种 通过判断浏览器的userAgent 用正则来判断是否是ios和Android客户端 代码如下
  • Python 八大排序算法合集

    1 选择排序 选择排序 升序 不稳定排序 原理 给定一个列表 经过第一轮比较后 找到最小值 与第一个位置交换 接着对不包括第一个元素的剩下的元素 找到最小值 与第二个位置交换 重复该过程 直到进行比较的记录只有一个为止 以 list 5 4
  • 关于STM32F0407译出错问题

    嵌入式编译出错问题 关于STM32F0407译出错问题 OBJ BEEP axf Error L6218E Undefined symbol TIM ClearITPendingBit referred from main o OBJ BE
  • Android系统开发之修改Captive Potal Service(消灭感叹号)

    本文原作者 长鸣鸟 未经同意 转载不带名的严重鄙视 谷歌在Android5 0之后的版本加入了CaptivePotalLogin服务 本服务的功能是检查网络连接互联网情况 主要针对于Wi Fi 不让Android设备自动连接那些不能联网的无
  • 查看应用程序依赖库

    1 ldd 如果是用x86架构编译的话 ldd可查看依赖的动态库 ldd a out linux vdso so 1 gt 0x00007fff13cd9000 libc so 6 gt lib x86 64 linux gnu libc
  • 不知道怎么开发VR游戏?Unity5.3官方VR教程重磅登场-系列3 VR中的交互方式

    不知道怎么开发VR游戏 Unity5 3官方VR教程重磅登场 系列3 VR中的交互方式 王寒 4 个月前 https zhuanlan zhihu com p 20505470 概览 在VR项目中 我们需要在用户 凝视 某个物体时将其激活