Предполагая, что поверхность вашей кнопки обращена к локальному направлению up
кнопки:
Тогда вы можете использовать точечное произведение между кнопками up
в мировом пространстве и дельта в мировом пространстве, чтобы определить, насколько палец движется против этого направления:
Vector3 worldFingerDelta;
Transform buttonTransform;
float deltaInButtonDown = Vector3.Dot(worldFingerDelta,
-buttonTransform.up);
// when deltainButtonDown is positive, the finger is moving in the
// same direction as "pushing the button"
// When it is negative, the finger is moving in the opposite direction.
// The magnitude of deltaInButtonDown is how much the finger is
// moving in that direction.
Если другойЛокальное направление указывает на поверхность кнопки, например, ее отрицательный forward
, вы просто используете соответствующий локальный вектор в мировом пространстве:
float deltaInButtonDown = Vector3.Dot(worldFingerDelta,
buttonTransform.forward); // negatives cancel out
Кроме того, если поверхность, на которой находится кнопка, перемещается в мировом пространстве, вы можете использовать Vector3.Dot(worldFingerDelta - worldButtonSurfaceDelta, buttonTransform.forward);
, чтобы такие вещи, как нажатие самой кнопки, перемещались в неподвижный палец.
О вашем ответе ....
_delta = (_forward.x * jvrPos.z + _forward.y * -jvrPos.y
+ _forward.z * -jvrPos.x);
if (_delta < 0) _delta = 0;
_forward
- кнопка вперед, а jvrPos
- локальная дельта моего контроллера / finger
Что касается векторной математики, вы делаете точечное произведение междувперёд Уттона и локальная дельта после некоторого преобразования инверсии / отражения применяются к нему.Итак, еще один способ написать свой ответ таков:
new Vector3 vec = new Vector3(jvrPos.z, -jvrPos.y, -jvrPos.x);
_delta = Vector3.Dot(vec, buttonTransform.forward);
Как мы обнаружили в комментариях к вашему ответу, это преобразование, основанное на вращении мира родителя контроллера,превращает вашу локальную дельту в негатив мировой дельты.Итак, взяв отрицательное значение, которое вы имеете для вектора, и сделав его отрицательным в вызове Dot
, вы можете написать еще один способ:
new Vector3 calculatedWorldFingerDelta = new Vector3(-jvrPos.z, jvrPos.y, jvrPos.x);
_delta = Vector3.Dot(-calculatedWorldFingerDelta, buttonTransform.forward);
И так какскалярное произведение A и -B равно скалярному произведению -A и B, ваш ответ эквивалентен:
new Vector3 calculatedWorldFingerDelta = new Vector3(-jvrPos.z, jvrPos.y, jvrPos.x);
_delta = Vector3.Dot(calculatedWorldFingerDelta, -buttonTransform.forward);
Что, если calculatedWorldFingerDelta
равно worldFingerDelta
, равнота же самая формула выше для кнопки с положительным направлением z, указывающим вне поверхности кнопки.
Я бы использовал worldFingerDelta
напрямую, потому что, если поворот мира или положение родителя пальца изменится, топреобразование, которое вы используете сейчас, не гарантированно даст вам calculatedWorldFingerDelta
, что равно worldFingerDelta
, и ваш ответ больше не будет работать.