forked from cgvr/DeltaVR
generated objects are grabbable and scalable
This commit is contained in:
Binary file not shown.
@@ -67,17 +67,19 @@ public class ShapeDetectionMinigameController : MonoBehaviour
|
|||||||
|
|
||||||
private void InitializeSpawnedObject(GameObject spawnedObject)
|
private void InitializeSpawnedObject(GameObject spawnedObject)
|
||||||
{
|
{
|
||||||
Rigidbody rigidbody = spawnedObject.AddComponent<Rigidbody>();
|
GameObject spawnedObjectParent = new GameObject("SpawnedModelParent");
|
||||||
|
spawnedObjectParent.transform.parent = modelSpawnPoint;
|
||||||
|
spawnedObjectParent.transform.position = modelSpawnPoint.transform.position;
|
||||||
|
Rigidbody rigidbody = spawnedObjectParent.AddComponent<Rigidbody>();
|
||||||
rigidbody.isKinematic = true;
|
rigidbody.isKinematic = true;
|
||||||
|
|
||||||
//spawnedObject.AddComponent<NetworkObject>();
|
//spawnedObject.AddComponent<NetworkObject>();
|
||||||
//spawnedObject.AddComponent<NetworkTransform>();
|
//spawnedObject.AddComponent<NetworkTransform>();
|
||||||
spawnedObject.transform.parent = modelSpawnPoint;
|
|
||||||
spawnedObject.transform.position = modelSpawnPoint.position;
|
spawnedObject.transform.parent = spawnedObjectParent.transform;
|
||||||
|
spawnedObject.transform.position = spawnedObjectParent.transform.position;
|
||||||
spawnedObject.tag = shapeScannerTag;
|
spawnedObject.tag = shapeScannerTag;
|
||||||
|
|
||||||
spawnedObject.SetActive(true);
|
spawnedObjectParent.AddComponent<TwoHandScaleGrabInteractable>();
|
||||||
|
|
||||||
spawnedObject.AddComponent<XRGrabInteractable>();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,88 @@
|
|||||||
|
|
||||||
|
using UnityEditor;
|
||||||
|
using UnityEngine;
|
||||||
|
using UnityEngine.XR.Interaction.Toolkit;
|
||||||
|
|
||||||
|
public class TwoHandScaleGrabInteractable : XRGrabInteractable
|
||||||
|
{
|
||||||
|
[Header("Two-Hand Scaling")]
|
||||||
|
public float minScale = 0.1f;
|
||||||
|
public float maxScale = 5f;
|
||||||
|
public float scaleLerpSpeed = 0f;
|
||||||
|
|
||||||
|
private Transform scalingTransform;
|
||||||
|
private float initialHandsDistance;
|
||||||
|
private Vector3 initialScale;
|
||||||
|
private bool twoHandsGrabbing;
|
||||||
|
|
||||||
|
void Start()
|
||||||
|
{
|
||||||
|
selectMode = InteractableSelectMode.Multiple;
|
||||||
|
useDynamicAttach = true;
|
||||||
|
reinitializeDynamicAttachEverySingleGrab = false;
|
||||||
|
|
||||||
|
scalingTransform = transform.GetChild(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override void OnSelectEntered(SelectEnterEventArgs args)
|
||||||
|
{
|
||||||
|
base.OnSelectEntered(args);
|
||||||
|
UpdateTwoHandState();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override void OnSelectExited(SelectExitEventArgs args)
|
||||||
|
{
|
||||||
|
Debug.Log("current local scale: " + transform.localScale);
|
||||||
|
base.OnSelectExited(args);
|
||||||
|
UpdateTwoHandState();
|
||||||
|
}
|
||||||
|
|
||||||
|
void UpdateTwoHandState()
|
||||||
|
{
|
||||||
|
if (interactorsSelecting.Count >= 2)
|
||||||
|
{
|
||||||
|
var a = interactorsSelecting[0];
|
||||||
|
var b = interactorsSelecting[1];
|
||||||
|
|
||||||
|
var pA = a.GetAttachTransform(this).position;
|
||||||
|
var pB = b.GetAttachTransform(this).position;
|
||||||
|
|
||||||
|
initialHandsDistance = Vector3.Distance(pA, pB);
|
||||||
|
initialScale = scalingTransform.localScale;
|
||||||
|
twoHandsGrabbing = initialHandsDistance > 0.0001f;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
twoHandsGrabbing = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void ProcessInteractable(XRInteractionUpdateOrder.UpdatePhase updatePhase)
|
||||||
|
{
|
||||||
|
base.ProcessInteractable(updatePhase);
|
||||||
|
|
||||||
|
if (!twoHandsGrabbing || interactorsSelecting.Count < 2 || initialHandsDistance <= 0.0001f)
|
||||||
|
return;
|
||||||
|
var a = interactorsSelecting[0];
|
||||||
|
var b = interactorsSelecting[1];
|
||||||
|
|
||||||
|
var pA = a.GetAttachTransform(this).position;
|
||||||
|
var pB = b.GetAttachTransform(this).position;
|
||||||
|
|
||||||
|
float current = Vector3.Distance(pA, pB);
|
||||||
|
if (current <= 0.0001f)
|
||||||
|
return;
|
||||||
|
|
||||||
|
float ratio = current / initialHandsDistance;
|
||||||
|
Debug.Log("distance ratio: " + ratio);
|
||||||
|
|
||||||
|
Vector3 desired = initialScale * ratio;
|
||||||
|
float uniform = Mathf.Clamp(desired.x, minScale, maxScale);
|
||||||
|
desired = new Vector3(uniform, uniform, uniform);
|
||||||
|
|
||||||
|
if (scaleLerpSpeed > 0f)
|
||||||
|
desired = Vector3.Lerp(transform.localScale, desired, Time.deltaTime * scaleLerpSpeed);
|
||||||
|
|
||||||
|
scalingTransform.localScale = desired;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 22c2ea15df0386746b1b1bc7b58bced7
|
||||||
|
MonoImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
Reference in New Issue
Block a user