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, но не вращается, так что выбранная плоскость находится прямо.
Пожалуйста помоги! Благодарю.
3 ответа
Знаете ли вы, что ваш самолет нормальный? Это правда, он определяет, с какой стороны самолет стоит. Нормаль - это вектор длиной 1.
Вы можете вычислить нормаль плоскости, если знаете три трехмерные точки на ней. Например: центр, центр сверху и центр справа. Позвоним в центр C
, центр наверху M1
и центр справа M2
,
Вот как рассчитать нормаль:
Cross(C - M1, C - M2)
(Если вы не знаете перекрестный продукт, посмотрите его)
Это даст вам вектор, определенный стрелкой:
Хорошо, так как мы можем использовать эту информацию? Зная нормали плоскости и ее центра, можно сказать следующее:
положение камеры = плоскость_положение + (плоскость_нормальное * расстояние)
Это поместит камеру в правильное положение, на некотором расстоянии от плоскости.
camera_direction = plane_normal * -1
Это заставляет камеру смотреть на самолет.
Однако я не думаю, что ActionScript 3 определяет взгляд камеры на функцию с вектором, я думаю, что он использует объект. Вы можете, например, поместить небольшой невидимый объект в центр плоскости и направить камеру на это. Это должно дать вам результат, который вы хотите.
Я думаю, что вы хотите работать в обратном направлении - сначала выберите точку на плоскости (X,Y,Z) (путем усреднения?), На которую вы хотите посмотреть. Затем выберите расстояние D от той точки, которой вы хотите быть.
Затем возьмите уравнение плоскости http://mathworld.wolfram.com/Plane.html ax + с помощью +cz=d (разные d) и оттуда выведите нормальный вектор n = (a,b,c). Нормализовать его и умножить на D, чтобы получить N = (A,B,C). Теперь есть только две точки, из которых вы могли бы смотреть: (X,Y,Z) +/- (A,B,C).
Итак, теперь выберите, хотите ли вы смотреть сзади или спереди - это повлияет на выбор + против - я просто не знаю, что есть что.
В блоге PV3D.org есть рабочий пример, который должен быть именно тем, что вы ищете.