Ошибка типа: вершины не определены - экспортер three.js для Blender

1

Не удалось загрузить файл JSON, созданный экспортером three.js для Blender, который поставляется с тэгом. Js r.86.

Настройка выполнена без проблем. Чтобы проверить этот экспортер, я открываю Blender, и я использую безымянный файл Blender, содержащий куб:

Изображение 174551

Экспортируя его без каких-либо настроек, он создает следующий файл JSON:

{
    "metadata":{
        "generator":"io_three",
        "normal":36,
        "position":36,
        "version":3,
        "type":"BufferGeometry"
    },
    "data":{
        "index":{
            "array":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35],
            "itemSize":1,
            "type":"Uint16Array"
        },
        "attributes":{
            "normal":{
                "array":[-7.10543e-15,-1,2.98023e-08,-7.10543e-15,-1,2.98023e-08,-7.10543e-15,-1,2.98023e-08,7.10543e-15,1,-2.98023e-08,7.10543e-15,1,-2.98023e-08,7.10543e-15,1,-2.98023e-08,1,-2.38419e-07,7.10543e-15,1,-2.38419e-07,7.10543e-15,1,-2.38419e-07,7.10543e-15,-5.96046e-08,-2.98023e-07,1,-5.96046e-08,-2.98023e-07,1,-5.96046e-08,-2.98023e-07,1,-1,-1.49012e-07,-2.38419e-07,-1,-1.49012e-07,-2.38419e-07,-1,-1.49012e-07,-2.38419e-07,2.38419e-07,1.78814e-07,-1,2.38419e-07,1.78814e-07,-1,2.38419e-07,1.78814e-07,-1,-1.77636e-15,-1,2.98023e-08,-1.77636e-15,-1,2.98023e-08,-1.77636e-15,-1,2.98023e-08,1.5099e-14,1,-2.98023e-08,1.5099e-14,1,-2.98023e-08,1.5099e-14,1,-2.98023e-08,1,3.27825e-07,5.66244e-07,1,3.27825e-07,5.66244e-07,1,3.27825e-07,5.66244e-07,-5.0664e-07,1.49012e-07,1,-5.0664e-07,1.49012e-07,1,-5.0664e-07,1.49012e-07,1,-1,-1.19209e-07,-2.08616e-07,-1,-1.19209e-07,-2.08616e-07,-1,-1.19209e-07,-2.08616e-07,2.38419e-07,1.78814e-07,-1,2.38419e-07,1.78814e-07,-1,2.38419e-07,1.78814e-07,-1],
                "itemSize":3,
                "type":"Float32Array"
            },
            "position":{
                "array":[1,-1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,0.999999,1,1,1,1,-1,1,1,-1,1,-1,1,1,-1,-1,0.999999,1,1,-1,-1,1,1,-1,1,-1,-1,1,-1,1,-1,-1,-1,-1,1,-1,-1,-1,1,-1,1,1,-1,1,-1,-1,1,-1,1,-1,-1,1,-1,1,-1,-1,1,1,0.999999,1,1,1,1,-1,0.999999,1,1,1,-1,1,0.999999,1,1,-1,1,1,-1,-1,1,-1,-1,1,-1,1,1,-1,1,-1,1,-1,-1,-1,-1,-1,-1,1,-1],
                "itemSize":3,
                "type":"Float32Array"
            }
        }
    }
}

Я загрузил файл JSON на сервер и с базовой настройкой попытался загрузить его в сцену:

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="utf-8">
        <title>My first three.js app</title>
        <meta name="viewport" content="width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0">
        <style>
            body { margin: 0; }
            canvas { width: 100%; height: 100% }
        </style>
    </head>
    <body>
        <script src="assets/js/three.js"></script>
        <script>

            /* Scene
             */
            var scene = new THREE.Scene();
            var camera = new THREE.PerspectiveCamera( 75, window.innerWidth/window.innerHeight, 0.1, 1000 );

            var renderer = new THREE.WebGLRenderer();
            renderer.setSize( window.innerWidth, window.innerHeight );
            document.body.appendChild( renderer.domElement );

            var geometry = new THREE.BoxGeometry( 1, 1, 1 );
            var material = new THREE.MeshBasicMaterial( { color: 0x00ff00 } );
            var cube = new THREE.Mesh( geometry, material );
            scene.add( cube );

            camera.position.z = 5;

            cube.rotation.x = 2;
            cube.rotation.y = 2;

            renderer.render(scene, camera);

            /* Load the JSON
             */
            var loader = new THREE.JSONLoader();

            loader.load(

                'https://www.example.com/blender-cube.json',

                function ( geometry, materials ) {

                    var material = materials[ 0 ];
                    var object = new THREE.Mesh( geometry, material );

                    scene.add( object );

                }
            );
        </script>
    </body>
</html>

С помощью вышеприведенного кода я получаю зеленый куб, извлеченный из примера страницы но когда вы достигаете Load the JSON части Load the JSON на консоли браузера отображается следующая ошибка:

ТипError: вершины не определены
Three.js: 33296.5

Указанная линия ошибок находится внутри функции parseModel( json, geometry ).

Мне кажется, что экспортер three.js для Blender пропускает что-то при создании JSON файла. Функция parseModel() ожидает свойство vertices не присутствующее в сгенерированном файле JSON.

Рабочий фрагмент с небольшой настройкой для Load the JSON части Load the JSON, чтобы иметь JSON файл в переменной JavaScript:

/* Scene
 */
var scene = new THREE.Scene();
var camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);

var renderer = new THREE.WebGLRenderer();
renderer.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(renderer.domElement);

var geometry = new THREE.BoxGeometry(1, 1, 1);
var material = new THREE.MeshBasicMaterial({
  color: 0x00ff00
});
var cube = new THREE.Mesh(geometry, material);
scene.add(cube);

camera.position.z = 5;

cube.rotation.x = 2;
cube.rotation.y = 2;

renderer.render(scene, camera);

/* Load the JSON
 */
var loader = new THREE.JSONLoader();

var blenderCubeObject = {
  "metadata": {
    "generator": "io_three",
    "normal": 36,
    "position": 36,
    "version": 3,
    "type": "BufferGeometry"
  },
  "data": {
    "index": {
      "array": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35],
      "itemSize": 1,
      "type": "Uint16Array"
    },
    "attributes": {
      "normal": {
        "array": [-7.10543e-15, -1, 2.98023e-08, -7.10543e-15, -1, 2.98023e-08, -7.10543e-15, -1, 2.98023e-08, 7.10543e-15, 1, -2.98023e-08, 7.10543e-15, 1, -2.98023e-08, 7.10543e-15, 1, -2.98023e-08, 1, -2.38419e-07, 7.10543e-15, 1, -2.38419e-07, 7.10543e-15, 1, -2.38419e-07, 7.10543e-15, -5.96046e-08, -2.98023e-07, 1, -5.96046e-08, -2.98023e-07, 1, -5.96046e-08, -2.98023e-07, 1, -1, -1.49012e-07, -2.38419e-07, -1, -1.49012e-07, -2.38419e-07, -1, -1.49012e-07, -2.38419e-07, 2.38419e-07, 1.78814e-07, -1, 2.38419e-07, 1.78814e-07, -1, 2.38419e-07, 1.78814e-07, -1, -1.77636e-15, -1, 2.98023e-08, -1.77636e-15, -1, 2.98023e-08, -1.77636e-15, -1, 2.98023e-08, 1.5099e-14, 1, -2.98023e-08, 1.5099e-14, 1, -2.98023e-08, 1.5099e-14, 1, -2.98023e-08, 1, 3.27825e-07, 5.66244e-07, 1, 3.27825e-07, 5.66244e-07, 1, 3.27825e-07, 5.66244e-07, -5.0664e-07, 1.49012e-07, 1, -5.0664e-07, 1.49012e-07, 1, -5.0664e-07, 1.49012e-07, 1, -1, -1.19209e-07, -2.08616e-07, -1, -1.19209e-07, -2.08616e-07, -1, -1.19209e-07, -2.08616e-07, 2.38419e-07, 1.78814e-07, -1, 2.38419e-07, 1.78814e-07, -1, 2.38419e-07, 1.78814e-07, -1],
        "itemSize": 3,
        "type": "Float32Array"
      },
      "position": {
        "array": [1, -1, -1, -1, -1, 1, -1, -1, -1, -1, 1, -1, 0.999999, 1, 1, 1, 1, -1, 1, 1, -1, 1, -1, 1, 1, -1, -1, 0.999999, 1, 1, -1, -1, 1, 1, -1, 1, -1, -1, 1, -1, 1, -1, -1, -1, -1, 1, -1, -1, -1, 1, -1, 1, 1, -1, 1, -1, -1, 1, -1, 1, -1, -1, 1, -1, 1, -1, -1, 1, 1, 0.999999, 1, 1, 1, 1, -1, 0.999999, 1, 1, 1, -1, 1, 0.999999, 1, 1, -1, 1, 1, -1, -1, 1, -1, -1, 1, -1, 1, 1, -1, 1, -1, 1, -1, -1, -1, -1, -1, -1, 1, -1],
        "itemSize": 3,
        "type": "Float32Array"
      }
    }
  }
};

var model = loader.parse(blenderCubeObject);

mesh = new THREE.Mesh(model.geometry, model.materials[0]);

scene.add(mesh);
body {
  margin: 0;
}

canvas {
  width: 100%;
  height: 100%
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/86/three.js"></script>

Любой ключ к тому, что происходит или что я делаю неправильно?

Теги:
blender
export
three.js

1 ответ

2
Лучший ответ

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

  • 0
    Решенные vertices is undefined , но генерируется новая ошибка model.materials is undefined в коде JavaScript, где я пытаюсь получить доступ к индексу 0: mesh = new THREE.Mesh(model.geometry, model.materials[0]); , Этот последний, я решил, отметив галочкой «Материалы для лица» в настройках экспорта. Я сейчас без каких-либо ошибок, но объект не отображается ... предмет другого вопроса. Спасибо за помощь.
  • 1
    Я обычно выбираю все вершины, грани, нормали и UV, а также выбираю материалы Face. Затем я создаю сетку с помощью нового THREE.Mesh (геометрия, новый THREE.MultiMaterial (материалы)) ;. В настоящее время это работает для меня. Я могу опубликовать рабочий файл JSON, если это поможет? Приветствия.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню