Как мне зафиксировать какой-либо элемент на экране в React-VR

Я хочу, чтобы счет или полоса здоровья всегда были видны в приложении react-vr.

Я мог бы использовать VrHeadModel - вращение, yawPitchRoll и положение, но мне нужно вычислить его только для того, чтобы он был фиксированным... кажется, я что-то упускаю.

Как мне это сделать?


person Frazer Kirkman    schedule 24.08.2017    source источник
comment
Вставка кода из файлов client.js и index.js этой ссылки в мой сработала для меня: github.com/facebook/react-360/tree/master/Samples/   -  person mattferrin    schedule 27.11.2018


Ответы (2)


Ответ состоит в том, чтобы использовать несколько поверхностей: одну без блокировки головы и другую с блокировкой головы.

См. «Использование нескольких поверхностей» здесь: Поверхности — React 360

Чтобы все заработало, вставьте недостающий код из примера в файлы client.js и index.js соответственно:

Вот ссылка на рабочий пример (частично вставленный ниже): Headlocked Surfaces

import { Math as VRMath, ReactInstance, Surface } from "react-360-web";

function init(bundle, parent, options = {}) {
  const horizontalPanel = new Surface(300, 300, Surface.SurfaceShape.Flat);
  const hvPanel = new Surface(300, 300, Surface.SurfaceShape.Flat);

  horizontalPanel.setAngle(0, -0.5);

  const cameraDirection = [0, 0, -1];

  const r360 = new ReactInstance(bundle, parent, {
    fullScreen: true,
    frame: () => {
      const cameraQuat = r360.getCameraQuaternion();
      cameraDirection[0] = 0;
      cameraDirection[1] = 0;
      cameraDirection[2] = -1;
      // cameraDirection will point out from the view of the camera,
      // we can use it to compute surface angles
      VRMath.rotateByQuaternion(cameraDirection, cameraQuat);
      const cx = cameraDirection[0];
      const cy = cameraDirection[1];
      const cz = cameraDirection[2];
      const horizAngle = Math.atan2(cx, -cz);
      const vertAngle = Math.asin(cy / Math.sqrt(cx * cx + cy * cy + cz * cz));
      horizontalPanel.setAngle(horizAngle, -0.5);
      hvPanel.setAngle(horizAngle, vertAngle);
    },
    ...options
  });

  r360.renderToSurface(r360.createRoot("HorizontalPanel"), horizontalPanel);
  r360.renderToSurface(r360.createRoot("HVPanel"), hvPanel);
}

window.React360 = { init };

В вашем client.js:

Внутри свойства frame конструктора ReactInstance установите угол поверхности, соответствующий камере: либо по горизонтали, либо по горизонтали и по вертикали.

В вашем index.js:

Не забудьте зарегистрировать компонент React на новой заблокированной поверхности.

person mattferrin    schedule 28.11.2018

Обновленный gist, который имеет меньшую задержку, поскольку он подписан на HM:

https://gist.github.com/cidicles/b4e978d3f3e2de8b359bdc51b5fb3261


Вот как я это делаю в настоящее время. Он имеет визуальную задержку и устанавливает состояние в цикле, но достигает цели.

Создайте состояние для массива VrheadModel.rotation().

constructor(props) {
  super(props);
  this.state = {
    hmRot: VrHeadModel.rotation()
  }
}

Запустить таймер

componentDidMount(){
  this.timer = setInterval(()=>{this.tick()}, 50);
}
componentWillUnmount(){
  clearInterval(this.timer);
}
tick(){
  this.setState({
    hmRot: VrHeadModel.rotation()
  });
}

Создайте вид в 0/0/0 и расположите фиксированный объект на сцене, как обычно. Установите вращение на главном виде, чтобы оно соответствовало вращению камеры.

  render(){
    let {hmRot} = this.state;
    return (
      <View
        style={{
          position: 'absolute',
          layoutOrigin: [0.5, 0.5],
          transform: [
            {translate: [0, 0, 0]},
            {rotateX: hmRot[0]},
            {rotateY: hmRot[1]},
            {rotateZ: hmRot[2]}
          ]
        }}>
        <Text
          style={{
            position: 'absolute',
            layoutOrigin: [0.5, 0.5],
            backgroundColor: '#f00',
            transform: [
              {translate: [0, 0, -2]},
            ]
          }}>
          Fixed
        </Text>
      </View>
    );
  }

По этой проблеме есть соответствующий пост от команды React VR здесь: https://github.com/facebook/react-vr/issues/261

person cidicles    schedule 25.08.2017
comment
спасибо, это работает довольно хорошо, за исключением случаев, когда пользователь смотрит очень высоко или на землю - тогда моя оценка (которая находится в верхней части экрана) дрейфует над экраном. - person Frazer Kirkman; 29.08.2017
comment
когда я пытаюсь отрегулировать это, когда вращение X слишком высокое или низкое, это работает, за исключением случаев, когда я оглядываюсь назад, тогда счет перемещается по всему экрану. - person Frazer Kirkman; 29.08.2017
comment
есть идеи, почему вращение отключается от экрана при взгляде вверх или вниз? - person Frazer Kirkman; 30.08.2017
comment
Я взглянул на это и не смог воспроизвести то, что вы видите. Я разместил полное описание своего компонента здесь: gist.github.com/cidicles/e90611844e9993d7c1337bb3c8afb23e - person cidicles; 30.08.2017
comment
Добавлен новый смысл для вас в пост, который может решить любые проблемы, которые у вас были. - person cidicles; 13.12.2017