Я создаю комнату на основе любого массива с точками.Объекты, которые можно перемещать, добавляются в комнату.Цель состоит в том, чтобы заблокировать возможность перемещения объекта из комнаты.
Когда объект перемещается, я проверяю, принадлежат ли все 4 нижние точки полу - если это так, вы можете переместить объект дальше -в противном случае это означает, что объект будет находиться за стеной, поэтому вам необходимо восстановить его в предыдущую позицию.
Функция, отвечающая за создание комнаты (wallPoint - это массив с точками)
var wallPoint = [
{
"X": 0,
"Y": 0
},
{
"X": 5,
"Y": 0
},
{
"X": 5,
"Y": 3
},
{
"X": 7,
"Y": 3
},
{
"X": 7,
"Y": 5
},
{
"X": 5,
"Y": 5
},
{
"X": 5,
"Y": 7
},
{
"X": 0,
"Y": 7
}
];
function createRoom() {
// create a walls
var walls = new THREE.Geometry();
var floorPoints = [];
wallsPoint.forEach(r => {
walls.vertices.push(new THREE.Vector3(r.X, r.Y, 0));
walls.vertices.push(new THREE.Vector3(r.X, r.Y, 3));
floorPoints.push(new THREE.Vector3(r.X, r.Y, 0));
walls.name = "wall";
});
var previousVertexIndex = walls.vertices.length - 2;
for (i = 0; i < walls.vertices.length; i += 2) {
walls.faces.push(new THREE.Face3(i + 1, i,
previousVertexIndex));
walls.faces.push(new THREE.Face3(previousVertexIndex + 1, i +
1, previousVertexIndex));
previousVertexIndex = i;
}
walls.computeFaceNormals();
var wallsTexture = new THREE.TextureLoader().load( 'walls.jpg' );//
var mesh = new THREE.Mesh(walls, new THREE.MeshBasicMaterial({
map: wallsTexture
}));
mesh.rotation.x= -Math.PI /2;
//create a floor
var floorShape = new THREE.Shape(floorPoints);
var floorGeometry = new THREE.ShapeGeometry(floorShape);
var floorTexture = new THREE.TextureLoader().load( 'wood.jpg' );
floor = new THREE.Mesh(floorGeometry, new THREE.MeshBasicMaterial({
map: floorTexture,
side: THREE.DoubleSide
}));
floor.geometry.vertices = floorPoints;
floor.geometry.name = "floor";
floor.rotation.x =-Math.PI/2;
group = new THREE.Object3D();
group.add(mesh);
group.add( floor );
group.add(ceiling) ;
scene.add( group );
}
Функция, ответственная за проверку наличия точек на полу.Точки - это helperBox.geometry.attributes.position.array (вспомогательный блок для объекта, который мы перемещаем мышью)на полу или нет.В настоящее время в большинстве случаев функция работает хорошо.К сожалению, не все из них.Каждый раз, когда он работает плохо - речь идет о пункте 3 и / или 4.
Как это исправить?В качестве альтернативы, как еще не следует позволять объекту (модель имеет формат obj - такой неправильной формы) выходить за пределы пола?