私は解決策を示すために他の誰かのバイブルをフォークしました。私は、SVGを変更し、モデル上のマテリアルを再描画するクリック機能を追加しました。
は、SVGの円の色を変更する例をhttp://jsfiddle.net/L4pepnj7/
どこかをクリックしてください。
SVGをencodedURIに変換する操作は、一定のループで行うことに集中しますが、レンダラーが独自の処理を行っている間に、クリックイベントに色の変更を加えることができます。 SVG要素の1つの色を変更する既存のフィドルに「clickBody」という関数を追加しました。
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();
ので、基本的には、このコードが何をしているかだけclickeventに更新されたテクスチャをレンダリングしている?SVGのサイズはUVマッピングに影響を与えたり、比例しているのでしょうか?私が意味する、800×800のSVGテクスチャが同じUVでテクスチャされますスペースは300x300よりも大きいですか? –
@robertgarciaはい。あなたの場合、3Dモデルのグラフィックスを変更するための製品設定ツールがあります。この場合、[svg-edit](https://github.com/SVG-Edit/svgedit)で有効にするなど、別のUIを使用してSVGを更新すると、コードをトリガーしてsvgをコード化して再描画することができますウリを材料の新しいテクスチャとして設定します。 – Radio
ポイントはグラフィックスをまったく変更しないということです。3Dモデルを読み込んだだけで、さまざまなデザイン(SVGのテクスチャ)から選択することができます。ひとつ希望すれば、テクスチャのSVGプロパティを変更することができます。たとえば、カラーピッカーインターフェイスを使用すると、あなたはトリックを行います、ありがとう! –