Исправление смещения координат при отбрасывании лучей из позиции касания на RenderTexture в Unity и Meta QuestC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Исправление смещения координат при отбрасывании лучей из позиции касания на RenderTexture в Unity и Meta Quest

Сообщение Anonymous »

Я разрабатываю VR-приложение для Meta Quest, используя Unity. В этом приложении пользователь взаимодействует с помощью контроллера, а рука пользователя визуально представлена ​​в виртуальном пространстве.
Цель:
Я хочу направьте луч в виртуальное пространство, соответствующее точке, к которой прикоснулась рука на объекте (далее именуемом «панель»), который имеет 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;
}
}
}

Я пересмотрел настройки RenderTexture, чтобы убедиться, что виртуальное пространство отображается правильно.
Как мне изменить код, чтобы точно отбрасывать лучи на основе положение касания?
Спасибо за помощь!

Подробнее здесь: https://stackoverflow.com/questions/784 ... on-on-rend
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Владение устройством на Meta Quest 2 и Quest 3
    Anonymous » » в форуме Android
    0 Ответы
    18 Просмотры
    Последнее сообщение Anonymous
  • Проблема с точностью рейкастинга в RenderTexture на основе положения касания в Unity VR
    Anonymous » » в форуме C#
    0 Ответы
    21 Просмотры
    Последнее сообщение Anonymous
  • Meta Quest/3 Unity SDK – Как получить информацию об уровне заряда батареи
    Anonymous » » в форуме C#
    0 Ответы
    33 Просмотры
    Последнее сообщение Anonymous
  • Meta Quest/3 Unity SDK – Как получить информацию об уровне заряда батареи
    Anonymous » » в форуме C#
    0 Ответы
    31 Просмотры
    Последнее сообщение Anonymous
  • Сборка Android: можно ли создать один и тот же APK для Pico и Meta Quest, используя Unity с OpenXR?
    Anonymous » » в форуме Android
    0 Ответы
    20 Просмотры
    Последнее сообщение Anonymous

Вернуться в «C#»