Цель:
Я хочу направьте луч в виртуальное пространство, соответствующее точке, к которой прикоснулась рука на объекте (далее именуемом «панель»), который имеет RenderTexture, показывающий часть виртуального пространства. В целях отладки куб с масштабом (0,1, 0,1, 0,1) отображается в позиции попадания в течение 0,1 секунды. В конце концов я планирую активировать систему частиц на кубе, существующем в позиции попадания.
Кроме того, камера, которая визуализирует RenderTexture, прикреплена к другим игрокам и всегда находится в движении.< /p>
Текущая проблема:
В настоящее время прикосновение к панели не вызывает никаких действий. Используя предыдущий метод, куб действительно создается при прикосновении, но координаты, куда попадает луч, значительно смещаются.
Статьи по ссылкам:
Как получить координату текстуры, на которую наведена мышь, на необработанном изображении пользовательского интерфейса в Unity?
Метод для отображения эффектов на объектах, к которым прикасаются с помощью RenderTexture (японский)
Вторая ссылка взята из вопроса, который я задавал ранее. При использовании этого метода куб генерируется при касании, но координаты, куда попадает луч, сильно смещаются.
Код:
Вот основной код, прикрепленный к панели. Мы будем очень признательны за любые предложения или изменения по устранению этой проблемы.
Код: Выделить всё
using UnityEngine;
using Photon.Pun;
using UnityEngine.UI;
public class PanelManager : MonoBehaviourPun
{
public Camera displayRenderCamera; // Camera that renders to the RenderTexture
private RawImage displayGameObject; // GameObject displaying the RenderTexture
private Vector3? colliderPoint = null; // Intersection point with the collider
void Start()
{
InitializeCameraAndPanel();
}
void Update()
{
bool gripHeld = OVRInput.Get(OVRInput.Button.PrimaryHandTrigger, OVRInput.Controller.RTouch);
bool triggerNotPressed = !OVRInput.Get(OVRInput.Button.PrimaryIndexTrigger, OVRInput.Controller.RTouch);
if (gripHeld && triggerNotPressed && colliderPoint != null) // Holding grip and not pressing trigger (pointing gesture)
{
InteractWithRenderTexture();
}
InitializeCameraAndPanel();
}
private void InitializeCameraAndPanel()
{
PhotonView[] allPhotonViews = FindObjectsOfType
();
foreach (PhotonView view in allPhotonViews)
{
if (view.Owner != null)
{
if (view.Owner.ActorNumber != PhotonNetwork.LocalPlayer.ActorNumber)
{
GameObject camera = view.gameObject.transform.Find("Head/ViewCamera")?.gameObject;
if (camera != null)
{
displayRenderCamera = camera.GetComponent();
Debug.Log(displayRenderCamera);
}
}
else if (view.Owner.ActorNumber == PhotonNetwork.LocalPlayer.ActorNumber)
{
GameObject panel = view.gameObject.transform.Find("Panel/Panel")?.gameObject;
if (panel != null)
{
displayGameObject = panel.GetComponent();
}
}
}
}
}
private void InteractWithRenderTexture()
{
if (colliderPoint == null) return;
Vector3 worldSpaceHitPoint = colliderPoint.Value;
Vector2 localHitPoint = displayGameObject.rectTransform.InverseTransformPoint(worldSpaceHitPoint);
var rect = displayGameObject.rectTransform.rect;
Vector2 textureCoord = localHitPoint - rect.min;
textureCoord.x *= displayGameObject.uvRect.width / rect.width;
textureCoord.y *= displayGameObject.uvRect.height / rect.height;
textureCoord += displayGameObject.uvRect.min;
Ray ray = displayRenderCamera.ViewportPointToRay(new Vector3(textureCoord.x, textureCoord.y, 0));
// Debug: Show a red cube at the touch location
Vector3 point = ray.GetPoint(2.0f);
GameObject cube = GameObject.CreatePrimitive(PrimitiveType.Cube);
cube.transform.position = point;
cube.transform.localScale = new Vector3(0.1f, 0.1f, 0.1f);
cube.GetComponent().material.color = Color.red;
Destroy(cube, 0.1f);
if (Physics.Raycast(ray, out var hit, 10.0f))
{
if (hit.transform.TryGetComponent(out var cubeManager))
{
cubeManager.StartParticleSystem();
}
}
}
void OnTriggerEnter(Collider other)
{
if (other.CompareTag("rightHand"))
{
var plane = new Plane(transform.forward, transform.position);
colliderPoint = plane.ClosestPointOnPlane(other.bounds.center);
}
}
void OnTriggerExit(Collider other)
{
if (other.CompareTag("rightHand"))
{
colliderPoint = null;
}
}
}
Как мне изменить код, чтобы точно отбрасывать лучи на основе положение касания?
Спасибо за помощь!
Подробнее здесь: https://stackoverflow.com/questions/784 ... on-on-rend