我正在尝试用three.js创建一个配置器,但是我需要改变产品的颜色,我想我可以使用svg作为纹理,改变svg的填充属性并很容易地更新纹理,但是我没有很好的效果。
目前我所拥有的是
使用svg作为纹理应用的-A 3D模型,但svg被放置在外部文件(“TextureLoader /texture.svg”)中( three.js也在缩小纹理的大小,但我认为这是一个映射问题)
-The svg是分层的,因此我可以手动更改颜色并应用它。
但是我想让它动态化,你选择一种颜色,它会自动更新作为纹理应用的svg。
有什么想法吗?
谢谢!
发布于 2017-08-29 08:04:49
我拿了别人的小提琴来展示解决方案。我添加了一个点击功能,它可以修改SVG并重绘模型上的材质。
请参阅http://jsfiddle.net/L4pepnj7/
在示例中的任意位置单击以更改SVG中圆的颜色。
将SVG转换为encodedURI的操作过于密集,需要在一个常量循环中进行,但您可以在渲染器执行自己的操作时将颜色更改放在单击事件中。我在现有的fiddle中添加了一个名为"clickBody“的函数,用于更改其中一个SVG元素的颜色。
var mesh;
var scene = new THREE.Scene();
var camera = new THREE.PerspectiveCamera(50, 500 / 400, 0.1, 1000);
camera.position.z = 10;
var renderer = new THREE.WebGLRenderer({
antialias: true
});
renderer.setSize(500, 400);
document.body.appendChild(renderer.domElement);
var svg = document.getElementById("svgContainer").querySelector("svg");
var svgData = (new XMLSerializer()).serializeToString(svg);
var canvas = document.createElement("canvas");
var svgSize = svg.getBoundingClientRect();
canvas.width = svgSize.width;
canvas.height = svgSize.height;
var ctx = canvas.getContext("2d");
var img = document.createElement("img");
var material;
img.setAttribute("src", "data:image/svg+xml;base64," + window.btoa(unescape(encodeURIComponent(svgData))));
img.onload = function() {
ctx.drawImage(img, 0, 0);
var texture = new THREE.Texture(canvas);
texture.needsUpdate = true;
var geometry = new THREE.SphereGeometry(3, 50, 50, 0, Math.PI * 2, 0, Math.PI * 2);
material = new THREE.MeshBasicMaterial({
map: texture
});
material.map.minFilter = THREE.LinearFilter;
mesh = new THREE.Mesh(geometry, material);
scene.add(mesh);
};
var colors = ["red", "orange", "yellow", "green", "blue"];
var c = 0;
function clickBody() {
document.getElementById("test").setAttribute("fill", colors[c]);
var svgData = (new XMLSerializer()).serializeToString(svg);
img.setAttribute("src", "data:image/svg+xml;base64," + window.btoa(unescape(encodeURIComponent(svgData))));
img.onload = function() {
ctx.drawImage(img, 0, 0);
var texture = new THREE.Texture(canvas);
material.map = texture;
material.map.needsUpdate = true;
renderer.render(scene, camera);
}
c = c + 1;
if (c == colors.length) {
c = 0;
}
}
document.body.addEventListener("click", clickBody)
var render = function() {
requestAnimationFrame(render);
mesh.rotation.y += 0.01;
renderer.render(scene, camera);
};
render();
https://stackoverflow.com/questions/45927235
复制相似问题