四处移动纸板
Moving a cardboard around
快速免责声明:我不是一个非常高级的 C# 用户,更习惯于像 python 这样的语言,所以如果答案就在我面前,我深表歉意。
我一直在为 Google Cardboard 制作一个小游戏,使用演示场景作为基础。我有一些代码可以检查 "Trigger Pull",然后应该将 Cardboard 相机向上移动 10 个单位。
//Checks For Magnet Trigger
if (Cardboard.SDK.Triggered)
{
//moves player up at a rate of 10u/s
transform.Translate(Vector3.up * 10);
Debug.Log("Triggered_Head");
//Tell Cardboard to maintain new position
}
目前这对于检测磁铁拉力非常有效,而且它确实平移了纸板。问题是纸板在平移后几乎立即被传送回基本位置。
目前我已将此代码插入 CardboardHead.cs 的 UpdateHead() 方法 (?),如下所示:
// Compute new head pose.
private void UpdateHead() {
if (updated) { // Only one update per frame, please.
return;
}
updated = true;
Cardboard.SDK.UpdateState();
if (trackRotation) {
var rot = Cardboard.SDK.HeadPose.Orientation;
if (target == null) {
transform.localRotation = rot;
} else {
transform.rotation = target.rotation * rot;
}
}
if (trackPosition) {
Vector3 pos = Cardboard.SDK.HeadPose.Position;
if (target == null) {
transform.localPosition = pos;
}
else {
transform.position = target.position + target.rotation * pos;
}
//Checks For Magnet Trigger
if (Cardboard.SDK.Triggered)
{
//moves player up at a rate of 10u/s
transform.Translate(Vector3.up * 10);
Debug.Log("Triggered_Head");
//Tell Cardboard to maintain new position
}
}
if (OnHeadUpdated != null) {
OnHeadUpdated(gameObject);
}
}
这样做一切正常,但位置几乎立即恢复(我假设在下一帧)。所以我的问题是:我如何使变换保持不变,有没有更好的方法来处理这个问题?
好吧,我想出了如何处理运动,我将解决方案发布在这里,以供将来无法弄清楚的人使用。快速说明:我确实更新到了最新版本的 SDK,尽管这应该没有什么区别,除了命名。
那么,第 1 步:
创建一个对象作为您的控制器。我只是使用了资产包中的一个原型立方体,但不管怎样都行(最好是空对象)。
将此物体或多或少放在两个相机的中心点。
将您的 GvrMain 对象作为控制器对象的父级(通过将其拖到控制器对象上)以及您希望随播放器移动的任何其他组件(枪支、GUI 等)
第 2 步:
为控制器对象创建脚本。
在 Update() 方法中,添加以下行:
if (GvrViewer.Instance.Triggered)
{
transform.Translate(Vector3.up)
}
对于旧版本,将 GvrViewer.Instance
替换为 Cardboard.SDK
根据自己的喜好自定义动作,任何正常的统一函数都应该有效。
一些不足:
你必须反复按下触发器,使用 while() 似乎破坏了统一性。这似乎很容易修复
代码片段立即向上平移 1。不确定如何稳定加速。
希望这对遇到我问题的人有所帮助。
快速免责声明:我不是一个非常高级的 C# 用户,更习惯于像 python 这样的语言,所以如果答案就在我面前,我深表歉意。
我一直在为 Google Cardboard 制作一个小游戏,使用演示场景作为基础。我有一些代码可以检查 "Trigger Pull",然后应该将 Cardboard 相机向上移动 10 个单位。
//Checks For Magnet Trigger
if (Cardboard.SDK.Triggered)
{
//moves player up at a rate of 10u/s
transform.Translate(Vector3.up * 10);
Debug.Log("Triggered_Head");
//Tell Cardboard to maintain new position
}
目前这对于检测磁铁拉力非常有效,而且它确实平移了纸板。问题是纸板在平移后几乎立即被传送回基本位置。
目前我已将此代码插入 CardboardHead.cs 的 UpdateHead() 方法 (?),如下所示:
// Compute new head pose.
private void UpdateHead() {
if (updated) { // Only one update per frame, please.
return;
}
updated = true;
Cardboard.SDK.UpdateState();
if (trackRotation) {
var rot = Cardboard.SDK.HeadPose.Orientation;
if (target == null) {
transform.localRotation = rot;
} else {
transform.rotation = target.rotation * rot;
}
}
if (trackPosition) {
Vector3 pos = Cardboard.SDK.HeadPose.Position;
if (target == null) {
transform.localPosition = pos;
}
else {
transform.position = target.position + target.rotation * pos;
}
//Checks For Magnet Trigger
if (Cardboard.SDK.Triggered)
{
//moves player up at a rate of 10u/s
transform.Translate(Vector3.up * 10);
Debug.Log("Triggered_Head");
//Tell Cardboard to maintain new position
}
}
if (OnHeadUpdated != null) {
OnHeadUpdated(gameObject);
}
}
这样做一切正常,但位置几乎立即恢复(我假设在下一帧)。所以我的问题是:我如何使变换保持不变,有没有更好的方法来处理这个问题?
好吧,我想出了如何处理运动,我将解决方案发布在这里,以供将来无法弄清楚的人使用。快速说明:我确实更新到了最新版本的 SDK,尽管这应该没有什么区别,除了命名。
那么,第 1 步:
创建一个对象作为您的控制器。我只是使用了资产包中的一个原型立方体,但不管怎样都行(最好是空对象)。
将此物体或多或少放在两个相机的中心点。
将您的 GvrMain 对象作为控制器对象的父级(通过将其拖到控制器对象上)以及您希望随播放器移动的任何其他组件(枪支、GUI 等)
第 2 步:
为控制器对象创建脚本。
在 Update() 方法中,添加以下行:
if (GvrViewer.Instance.Triggered)
{
transform.Translate(Vector3.up)
}
对于旧版本,将 GvrViewer.Instance
替换为 Cardboard.SDK
根据自己的喜好自定义动作,任何正常的统一函数都应该有效。
一些不足:
你必须反复按下触发器,使用 while() 似乎破坏了统一性。这似乎很容易修复
代码片段立即向上平移 1。不确定如何稳定加速。
希望这对遇到我问题的人有所帮助。