Three.js - Лица отсутствуют после импорта Blender

57
6

Я попытался импортировать экспортированный JSON файл моей 3D-модели и импортировать его в файл Three.js, но кажется, что некоторые лица отсутствуют.

Я не уверен, что это проблема экспорта, потому что, когда я поворачиваю ее, левая сторона существует, но на правом лице нет, наоборот.

enter image description here enter image description here

Вот моя оригинальная модель в Blender:

enter image description here

var scene, camera, renderer;

var WIDTH  = window.innerWidth;
var HEIGHT = window.innerHeight;

var SPEED = 0.01;

function init() {
scene = new THREE.Scene();

initMesh();
initCamera();
initLights();
initRenderer();

document.body.appendChild(renderer.domElement);
}

function initCamera() {
camera = new THREE.PerspectiveCamera(70, WIDTH / HEIGHT, 1, 10);
camera.position.set(0, 3.5, 5);
camera.lookAt(scene.position);
}

function initRenderer() {
renderer = new THREE.WebGLRenderer({ antialias: true });
renderer.setSize(WIDTH, HEIGHT);
}

function initLights() {
var directionalLight = new THREE.DirectionalLight( 0xffffff, 0.8 );
directionalLight.position.set( 0, 1, 0 );
scene.add( directionalLight );
}

var mesh = null;
function initMesh() {
var loader = new THREE.JSONLoader();
loader.load('./model.json', function(geometry, materials) {
mesh = new THREE.Mesh(geometry, new THREE.MeshFaceMaterial(materials));
mesh.scale.x = mesh.scale.y = mesh.scale.z = 0.75;
mesh.translation = THREE.GeometryUtils.center(geometry);
mesh.position.x = -5;
scene.add(mesh);
});
}

function rotateMesh() {
if (!mesh) {
return;
}

mesh.rotation.y -= SPEED;
}

function render() {
requestAnimationFrame(render);
rotateMesh();
renderer.render(scene, camera);
}

init();
render();

Надеюсь, вы можете помочь мне с этой проблемой. Заранее спасибо!

спросил(а) 2016-12-04T23:57:00+03:00 3 года, 9 месяцев назад
1
Решение
70

Я подозреваю, что ваша проблема связана с лицом-нормали, указывающим в неправильном направлении. Чтобы проверить, действительно ли это так, вы можете попытаться установить все материалы на двусторонней основе:

materials.forEach(function(mat) {
mat.side = THREE.DoubleSide;
});

В режиме Двусторонний грани рисуются независимо от направления нормалей, поэтому вы должны видеть все грани, если они включены.

Или вы можете использовать THREE.FaceNormalsHelper, чтобы посмотреть на нормали самостоятельно.

scene.add(new THREE.FaceNormalsHelper(mesh, 2, 0x00ff00, 1));

Это сделает стрелки для всех лиц, указывающих направление в нормальном направлении.

Если нормали ошибочны, вы можете исправить это в блендере, выбрав все затронутые лица и используя команду Mesh> Faces> Flip Normals из меню или в панели инструментов в правой части в "Shading/UV" [CN00 ]. Иногда просто выбирая все лица и запуская "Пересчитать нормали" из Инструментов, также будет работать. Blender также имеет режим отображения для лиц-нормалей в меню правой руки в "Mesh Display" -Section.

ответил(а) 2016-12-05T01:36:00+03:00 3 года, 9 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема