У меня есть орфографическая камера в osg сцене.В этой сцене будут отображаться плоские объекты (плоскости), и я хочу, чтобы камера автоматически указывала на них, чтобы их можно было видеть в лоб, а также увеличивала масштаб, чтобы показать как можно большую часть плоскости.насколько это возможно, не обрезая края.
Пока я правильно ориентируюсь, чтобы смотреть на плоскость:
osg::Vec3d eye; // dummy
osg::Vec3d center; // we only really care about this here
osg::Vec3d up; // dummy
cameraManipulator->getViewMatrixAsLookAt(eye, center, up);
osg::Vec3d desiredVec(velocityX, velocityY, velocityZ); // velocity of the plane I want to look at
desiredVec.normalize();
desiredVec = -desiredVec; // invert
desiredVec += center; // align
cameraManipulator->setViewMatrixAsLookAt(desiredVec, center, osg::Vec3d(0, 0, -1));
Это позиционирует меня так, что я смотрю на плоскость головы.включен, но он слишком сильно увеличен, поэтому я думаю, что мне нужно немного сместить мою камеру вдоль вектора скорости на некоторое значение, и я не знаю, как рассчитать это значение.Примерно так:
osg::Vec3d dir = desiredVec - center; // the direction (vector) in which we want to move
dir.normalize();
double scaleFactor = (width * height) / 2; // test
desiredVec += (dir * scaleFactor); // add it to desiredVec to move back in that direction (by scaleFactor)
Похоже, что "тестовые" функции scaleFactor работают нормально, они дают вид плоскости с полем вокруг края.Я предполагаю, что это то, что нужно изменить.
По сути, как рассчитать расстояние, на которое нужно переместить камеру назад, чтобы просмотреть всю текущую плоскость?У меня есть информация о скорости, размере самолета и т. Д.