Обновление вершин 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