@Ork00
Я любопытный человек

Как в three.js сделать так чтобы не переходило сквозь обьекты на сцене?

Привет всем
Есть кое какая вещь основанная на примере вот этого раздела
https://threejs.org/examples/#misc_controls_pointerlock
тут можно гулять от первого лица, но как сделать так чтобы натыкалось на эти кубики и камерой не было возможно переходить сквозь них, и на краях меша floor чтобы останавливалась камера обьекта кто то может помочь?
  • Вопрос задан
  • 562 просмотра
Пригласить эксперта
Ответы на вопрос 1
@choupa
Архитектор (обычный, который строит)
Т.к. геометрия объектов простая и понятная — кубики — то я бы просто анализировал координаты. А именно после совершении очередного шага в строке 375 добавил бы

if ( checkCollision() )	{
	controls.getObject().translateX( -velocity.x * delta );
	controls.getObject().translateY( -velocity.y * delta );
	controls.getObject().translateZ( -velocity.z * delta );
}


т.е. при обнаружении столкновения откатывался бы шаг назад. Функция определения столкновения:

function checkCollision()	{
	var collision = false;
	for ( boх in objects )	{  //  Перебираем все кубики.
		// Если оказались ближе 10 к центру кубика, значит мы оказались у него внутри, т.к. кубы там размером 20х20.
		collision |= ( 
			( Math.abs( box.postion.x - controls.getObject().position.x) < 10 ) &
			( Math.abs( box.postion.y - controls.getObject().position.y) < 10 ) &
			( Math.abs( box.postion.z - controls.getObject().position.z) < 10 )
		 );
	}
	return collision;	
}


Код не проверял. С обнаружением границ мира примерно также. Думаю, справитесь.

Если объекты произвольной, но выпуклой формы, то тогда я бы из точки первого лица пускал бы два луча (raycast) в диаметрально противоположных направлениях. Потом анализировал объекты, которые они пересекли. Если один и тот же объект пересекли оба луча, значит мы оказались у него внутри.

С невыпуклыми телами сложнее, думать не хочу.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы