Обновление вершин DecalGeometry, UVs,

В настоящее время я играю с наклейками ThreeJS. Я смог нанести красивое пятно на мою сферу.

Вот фрагмент кода, который я использую, чтобы "нанести" наклейку на мою сферу. (У меня есть несколько пользовательских классов, но не беспокойтесь об этом.

// Create sphere
var mainMesh = new THREE.Mesh(
    new THREE.SphereGeometry(7, 16, 16),
    new THREE.MeshBasicMaterial({ color: 0x00a1fd })
);

// Declare decal material
var decalMaterial = new THREE.MeshPhongMaterial({
    color               : 0xff0000,    
    specular            : 0x444444,
    map                 : TextureLoader.instance.getTexture('http://threejs.org/examples/textures/decal/decal-diffuse.png'),
    normalMap           : TextureLoader.instance.getTexture('http://threejs.org/examples/textures/decal/decal-normal.jpg'),
    normalScale         : new THREE.Vector2( 1, 1 ),
    shininess           : 30,
    transparent         : true,
    depthTest           : true,
    depthWrite          : false,
    polygonOffset       : true,
    polygonOffsetFactor : -4,
    wireframe           : false
});

// Create decal itself
var decal = new THREE.Mesh(
    new THREE.DecalGeometry(
        mainMesh,
        new THREE.Vector3(0, 2.5, 3),
        new THREE.Vector3(0, 0, 0),
        new THREE.Vector3(8, 8, 8),
        new THREE.Vector3(1, 1, 1)
    ),
    decalMaterial.clone()
);

// Add mesh + decal + helpers
scene.add(
    mainMesh,
    new THREE.HemisphereLight(0xffffff, 0, 1),
    decal,
    new THREE.WireframeHelper(decal, 0xffff00)
);

decal.add(new THREE.BoxHelper(decal, 0xffff00));

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

К сожалению, когда я звоню decal.geometry.computeDecal()Сетка с переводной картинкой не обновляется. Я не могу найти никакого решения по этому поводу.

    function moveDecal()
    {
        decal.translateX(1);
        decal.geometry.computeDecal();
    };

Согласно DecalGeometry класс, функция computeDecal уже установлены в true различные члены, необходимые для обновления вершин, цветов, UV,....

    this.computeDecal = function() {
        // [...]
        this.verticesNeedUpdate     = true;
        this.elementsNeedUpdate     = true;
        this.morphTargetsNeedUpdate = true;
        this.uvsNeedUpdate          = true;
        this.normalsNeedUpdate      = true;
        this.colorsNeedUpdate       = true;
     };

Спасибо за помощь!: D

PS: ThreeJS R80

1 ответ

Вы пытаетесь обновить вершины своей геометрии.

Вы можете изменить значение вершинного компонента,

geometry.vertices[ 0 ].x += 1;

но вы не можете добавлять новые вершины

geometry.vertices.push( new THREE.Vector3( x, y, z ) ); // not allowed

или назначить новый массив вершин

geometry.vertices = new_array; // not allowed

после того, как геометрия была предоставлена ​​хотя бы один раз.

Похоже, для других атрибутов, таких как ультрафиолетовые лучи.

Для получения дополнительной информации см. Этот ответ: verticesNeedUpdate в Three.js.

Three.JS R.80

Другие вопросы по тегам