Ich möchte ein VR-Spiel in Einheit machen. Ich habe diese Grundlagen wie eine Tür, eine Schublade, eine Pistole und ein Objektauswahl-Skript. Ich würde gerne einen Basis-Builder/Editor erstellen, aber ich habe absolut keine Ahnung, wie man dorthin kommt, wo der Controller hinweist (wie ein Laserpointer) Das Projekt ist in C#Wie bekomme ich den Ort ein vive motion cotrolller zeigt auf (in Einheit)
0
A
Antwort
0
Sie müssen ein Raycast von Ihrem Controller zum Objekt.
https://docs.unity3d.com/ScriptReference/Physics.Raycast.html
Ihre Arbeit zu vereinfachen, würde ich Ihnen empfehlen, die VRTK Toolkit zu verwenden, die Sie einfach als assert Ihre Einheit Projekt hinzufügen können: wie viele Funktionen https://vrtoolkit.readme.io/
Das Toolkit Hut, Laserpunkt, Grapping usw.
Ich hoffe, das hilft Ihnen!
EDIT:
Hier ist ein sehr gutes Beispiel für einen Laser-Pointer vom VRTK Toolkit:
using UnityEngine;
using System.Collections;
public class ViveCursor : MonoBehaviour
{
public enum AxisType
{
XAxis,
ZAxis
}
public Color color;
public float thickness = 0.002f;
public AxisType facingAxis = AxisType.XAxis;
public float length = 100f;
public bool showCursor = true;
GameObject holder;
GameObject pointer;
GameObject cursor;
Vector3 cursorScale = new Vector3(0.05f, 0.05f, 0.05f);
float contactDistance = 0f;
Transform contactTarget = null;
void SetPointerTransform(float setLength, float setThicknes)
{
//if the additional decimal isn't added then the beam position glitches
float beamPosition = setLength/(2 + 0.00001f);
if (facingAxis == AxisType.XAxis)
{
pointer.transform.localScale = new Vector3(setLength, setThicknes, setThicknes);
pointer.transform.localPosition = new Vector3(beamPosition, 0f, 0f);
if (showCursor)
{
cursor.transform.localPosition = new Vector3(setLength - cursor.transform.localScale.x, 0f, 0f);
}
}
else
{
pointer.transform.localScale = new Vector3(setThicknes, setThicknes, setLength);
pointer.transform.localPosition = new Vector3(0f, 0f, beamPosition);
if (showCursor)
{
cursor.transform.localPosition = new Vector3(0f, 0f, setLength - cursor.transform.localScale.z);
}
}
}
// Use this for initialization
void Start()
{
Material newMaterial = new Material(Shader.Find("Unlit/Color"));
newMaterial.SetColor("_Color", color);
holder = new GameObject();
holder.transform.parent = this.transform;
holder.transform.localPosition = Vector3.zero;
pointer = GameObject.CreatePrimitive(PrimitiveType.Cube);
pointer.transform.parent = holder.transform;
pointer.GetComponent<MeshRenderer>().material = newMaterial;
pointer.GetComponent<BoxCollider>().isTrigger = true;
pointer.AddComponent<Rigidbody>().isKinematic = true;
pointer.layer = 2;
if (showCursor)
{
cursor = GameObject.CreatePrimitive(PrimitiveType.Sphere);
cursor.transform.parent = holder.transform;
cursor.GetComponent<MeshRenderer>().material = newMaterial;
cursor.transform.localScale = cursorScale;
cursor.GetComponent<SphereCollider>().isTrigger = true;
cursor.AddComponent<Rigidbody>().isKinematic = true;
cursor.layer = 2;
}
SetPointerTransform(length, thickness);
}
float GetBeamLength(bool bHit, RaycastHit hit)
{
float actualLength = length;
//reset if beam not hitting or hitting new target
if (!bHit || (contactTarget && contactTarget != hit.transform))
{
contactDistance = 0f;
contactTarget = null;
}
//check if beam has hit a new target
if (bHit)
{
if (hit.distance <= 0)
{
}
contactDistance = hit.distance;
contactTarget = hit.transform;
}
//adjust beam length if something is blocking it
if (bHit && contactDistance < length)
{
actualLength = contactDistance;
}
if (actualLength <= 0)
{
actualLength = length;
}
return actualLength; ;
}
void Update()
{
Ray raycast = new Ray(transform.position, transform.forward);
RaycastHit hitObject;
bool rayHit = Physics.Raycast(raycast, out hitObject);
float beamLength = GetBeamLength(rayHit, hitObject);
SetPointerTransform(beamLength, thickness);
}
}
Verwandte Themen
- 1. Wie bekomme ich den Ort in Fragment?
- 2. Einheit, wie Vive Controller Spielobjekte zu finden?
- 3. Wie bekomme ich den Ort - php
- 4. Wie bekomme ich den letzten Ort auf Glas zuverlässig?
- 5. Symfony3.2 Cotrolller Fabrik
- 6. Wie bekomme ich den Ort durch berechnete Breite und Länge
- 7. Wie bekomme ich Telegramm Benutzer Ort
- 8. Wie kann man feststellen, ob ein SteamVR_TrackedObject ein Vive Controller oder ein Vive Tracker ist?
- 9. Wie bekomme ich ein Bild von einem Ort mit GeoDataApi?
- 10. Wie bekomme ich physikalische Konstante in scipy in cgs Einheit?
- 11. wie kann ich motion geo punkt auf android machen?
- 12. Wie bekomme ich Bilddatum, Ort, Größe, Ausrichtung in ios?
- 13. WebGL texImage2D Probleme: Wie bekomme ich Textur auf Einheit/Objekt?
- 14. Wie bekomme ich die Adresse eines Wertes, auf den ein Zeiger zeigt
- 15. Wie man ein Zeichen in der Einheit zeigt/versteckt
- 16. Wie bekomme ich ein Ort Detail von Google Ort api, mit nur Standort Längen- und Breitengrad
- 17. Wie bekomme ich Schienen Bild Ort in Javascript-Datei
- 18. Zeigt nur ein Ort Erlaubnis Alarm
- 19. Wie bekomme ich Benutzer Anfang und Ende Ort in Uber
- 20. Wie bekomme ich die Anzahl der Klicks in Einheit C#
- 21. Wie bekomme ich GPS-Koordinaten in Einheit 3d
- 22. Unity HTC VIVE Teleportation
- 23. Unreal Engine HTC Vive Controller Setup
- 24. Wie bekomme ich Listendaten an einen anderen Ort in C#
- 25. Motion Tracking: Tracking-Ball in Bezug auf ein Gericht
- 26. Wie kann ich das Bild hinzufügen, so dass es das Bild nicht nur den Ort zeigt?
- 27. Wie bekomme ich einen CGPoint von einem geklopften Ort?
- 28. Wie bekomme ich den zitierten Text in ein Zitat?
- 29. Wie bekomme ich Trends von Twitter zu einem bestimmten Ort?
- 30. Wie speichere ich den Wert eines Registers in einen Speicherbereich, auf den ein Zeiger zeigt?