Мировая позиция, указанная вектором камеры вида - PullRequest
0 голосов
/ 13 мая 2019

Я реализовал fps-камеру на основе векторов вверх, вправо и просмотра от this .

Сейчас я хочу иметь возможность взаимодействовать с миром, помещая кубы встиль майнкрафт.

Мой вектор lookAt - это сумма вектора обзора и положения камеры, поэтому моей первой попыткой было нарисовать куб при lookAt, но это вызывает странное поведение.

Я вычисляю каждыйвектор, как в сети, которую я упоминал (например, lookAt = camera_position + view_direction), но нарисованный куб всегда окружает меня.Я пробовал несколько вещей, таких как фактическое размещение (округление lookAt), и оно появляется рядом с желаемой позицией, но не в том месте, на которое я смотрю.

Учитывая эти векторы, как я могу нарисовать с центромположение, на которое смотрит моя камера, но немного дальше (точно так же, как в minecraft)?

Ответы [ 2 ]

1 голос
/ 13 мая 2019

но нарисованный куб всегда окружает меня.

Да, и это очевидно.Вы помещаете кубы на поверхность сферы радиуса view_direction с центром в camera_position.

Учитывая эти векторы, как я могу нарисовать, что это центрировано в положении, которое смотрит моя камера, но немногодальше (точно так же, как в minecraft)?

Вам необходимо поместить кубы на пересечении вектора view с геометрией сцены.В простейшем случае это может быть просто «земля», так что вам нужно пересечь view вектор с «землей» плоскости.Затем необходимо округлить пересечение xyz координат до ближайшего узла сетки xyz = round(xyz / cubexyz)*cubexyz, где cubexyz - размер куба.

Приблизительный код:

Vector3D intersectPoint(Vector3D rayVector, Vector3D rayPoint, Vector3D planeNormal, Vector3D planePoint) {
    Vector3D diff = rayPoint - planePoint;
    double prod1 = diff.dot(planeNormal);
    double prod2 = rayVector.dot(planeNormal);
    double prod3 = prod1 / prod2;
    return rayPoint - rayVector * prod3;
}

.......
Vector3D cubePos = intersectPoint(view_direction, camera_position, Vector3D(0, 1, 0), Vector3D(0, 0, 0));
cubePos = round(cubePos / cubeSize) * cubeSize;
AddCube(cubePos);
0 голосов
/ 13 мая 2019

Трудно сказать, не имея изображений для просмотра, но взгляд. Скорее всего, это ваш нормализованный вектор вперед?Если я вас правильно понял, вы бы хотели сделать что-то вроде objectpos = camerapos + forward * 10f (где 10f - это расстояние, на которое вы хотите поместить объект перед вами в трехмерных космических единицах), чтобы убедиться, что он расположен на несколько единиц передваш контроллер fps.

на самом деле, если view_direction - это ваш нормализованный вектор вперед, а ваш lookAt - camera_pos + view_direction, то вы получите что-то очень близкое к положению вашей камеры, что объясняет, почему внутри появляется кубвы.в любом случае, мое предложение все еще должно работать:)

...