2016-05-12 11 views
1

Я хотел бы знать, как я мог бы сделать камеру в этом три Js Например: http://threejs.org/examples/#webgl_terrain_dynamicкак сделать камеру следующим образом высоту местности в этом образце: http://threejs.org/examples/#webgl_terrain_dynamic

следует за высотой местности. Итак, пока ландшафт движется, камера будет подниматься и опускаться в соответствии с холмами (высотой) местности.

Другими словами, как я мог бы получить высоту местности, зная, что высота ландшафта построена по высоте?

Я уже попробовать с Raycaster как следующим образом:

var raycaster = new THREE.Raycaster(camera.position, new THREE.Vector3(0, -1, 0)); 
var intersects = raycaster.intersectObject(terrain, false); 
var intersect_point = intersetcs[0].point; 

Но intersect_point всегда имеет у значение, равное 0, независимо от того, где камера расположена. Действительно, высота ландшафта в этом примере создается с помощью карты высот. Таким образом, геометрия ландшафта, которая является планом, не изменяется по высоте и остается плоской, следовательно, результат raycaster.

Не могли бы вы помочь мне в том, как найти способ получить высоту местности для данной позиции.

благодарит за вашу помощь.

+0

в том, что кто-то может помочь? – user6327458

+0

Привет, вы можете проверить этот пример: http://threejs.org/examples/#webgl_geometry_extrude_splines Я хочу нечто подобное, но с геометрией геометрии тора. По-видимому, вы можете рассчитать траекторию камеры с помощью некоторой векторной магии. –

ответ

1

В самом примере вычислите положение камеры относительно текстуры высотной карты и прочитайте информацию о высоте (вы можете посмотреть в карту высот шейдера, чтобы определить, как ее читать, так как я не помню подробностей этого).

Вот общее решение, которое я бы использовал.

Шаг 1: Повторите рельефный шейдер (тот, который добавляет цвет, а не тот, который создает физическую поверхность), и измените его так, чтобы вместо вывода цвета ландшафта выводить цвет на основе расстояния от камеры (подумайте MeshDepthMaterial или MeshDistanceMaterial). Вам нужно выполнить некоторый поплавок < -> цвет packing, чтобы вы могли прочитать полный возврат поплавка. Мы назовем это «Shader Distance», так как его цель - отобразить, насколько далеко от вашей камеры.

Шаг 2: Добавьте камеру, которая выглядит прямо вниз (относительно местности), вам нужно сохранить синхронизацию этой камеры с вашей реальной камерой. Это должно быть довольно легко сделать во время цикла рендеринга (просто скопируйте вектор положения). Поле зрения камеры может быть очень маленьким (например, 1 градус). Мы будем называть это вашей «Высокой камерой», поскольку ее цель - определить высоту.

Шаг 3: В вашем цикле рендеринга. Сначала визуализируйте ландшафт с помощью «Shader» и «Height Camera» в цель текстуры (может быть маленькой, может быть, всего 1 пиксель на 1 пиксель).

Шаг 4: Прочтите информацию о цвете от цели текстуры на шаге 3, скрывайте ее от RGBA обратно в поплавок, используя обратный цвет packing. Теперь у вас есть высота.

+0

Неплохо, похоже, вы не можете читать текстуру высотной карты напрямую. Решение может состоять в том, чтобы сделать его первым на шаге 2 ~ 4, упаковав его в RGBA перед его чтением. – ShuberFu

 Смежные вопросы

  • Нет связанных вопросов^_^