#actionscript-3 #papervision3d
#actionscript-3 #papervision3d
Вопрос:
У меня есть стена плоскостей под разными углами и в разных положениях. Я хотел бы заставить камеру поворачиваться и смотреть прямо на сфокусированную плоскость. Я создал фиктивную плоскость (lookAtMe), которая соответствует плоскости, на которую я нажимаю, следующим образом:
private function planeClicked(e:InteractiveScene3DEvent):void
{
lookAtTarget.copyTransform(this);
var time:Number = 1;
var tweenObject:Object = {};
tweenObject.x = lookAtTarget.x;
tweenObject.y = lookAtTarget.y;
tweenObject.z = lookAtTarget.z;
tweenObject.rotationX = lookAtTarget.rotationX;
tweenObject.rotationY = lookAtTarget.rotationY;
tweenObject.rotationZ = lookAtTarget.rotationZ;
tweenObject.onUpdate = onSeatTween;
tweenObject.ease = Cubic.easeInOut;
TweenMax.to(lookAtMe, time, tweenObject);
}
private function onSeatTween():void
{
camera.lookAt(lookAtMe);
}
Камера центрируется на плоскости looAtMe, но не поворачивается так, чтобы выбранная плоскость была прямой.
Пожалуйста, помогите! Спасибо.
Комментарии:
1. Вы понимаете математику, стоящую за этим, или просто строите догадки?
2. В основном догадки — я совсем новичок в этом. буду признателен за любую помощь.
Ответ №1:
Знаете ли вы, что ваша плоскость имеет нормальный? Это правда, оно определяет, с какой стороны обращена плоскость. Нормаль — это вектор длиной 1.
Вы можете вычислить нормаль к плоскости, если знаете три трехмерные точки на ней. Например: центр, центр вверху и центр справа. Давайте назовем центр C
, центр вверху M1
и центр справа M2
.
Вот как вычислить нормальное:
Cross(C - M1, C - M2)
(Если вы не знаете перекрестный продукт, пожалуйста, посмотрите его)
Это даст вам вектор, определенный стрелкой:
Хорошо, итак, как мы можем использовать эту информацию? Зная нормаль плоскости и ее центр, мы можем сказать следующее:
camera_position = plane_position (plane_normal * расстояние)
Это позволит поместить камеру в правильное положение, на некотором расстоянии от плоскости.
camera_direction = plane_normal * -1
Это заставляет камеру смотреть на плоскость.
Однако я не думаю, что ActionScript 3 определяет функцию просмотра камеры с помощью вектора, я думаю, что она использует объект. Вы могли бы, например, поместить небольшой невидимый объект в центр плоскости и навести на него камеру. Это должно дать вам желаемый результат.
Ответ №2:
Я думаю, вы хотите поработать в обратном направлении — сначала выберите точку на плоскости (X, Y, Z) (путем усреднения?) на что вы хотите посмотреть. Затем выберите расстояние D от той точки, в которой вы хотите находиться.
Далее возьмем уравнение плоскости http://mathworld.wolfram.com/Plane.html ax by cz= d (другое d) и оттуда выводим вектор нормали n = (a, b, c). Нормализуйте его и умножьте на D, чтобы получить N = (A, B, C). Теперь есть только две точки, из которых вы могли бы смотреть: (X, Y, Z) /- (A, B, C).
Итак, теперь выберите, хотите ли вы смотреть сзади или спереди — это повлияет на выбор vs -, я просто не знаю, что есть что.
Ответ №3:
В PV3D.org в блоге есть рабочий пример, который должен быть именно тем, что вы ищете.