哇!这是一个非常好的代码示例!它也很顺利。它更好地显示了问题。
我在fabric js 演示中找到了第一个问题(类似于three.js 问题)的解决方案:http://fabricjs.com/controls-customization。
我不擅长面料,所以可能有比这更优雅的解决方案。您可以隐藏控件,渲染到 three.js,然后再次显示它们。您还必须强制画布进行渲染,否则将无法正常工作。
function animate() {
requestAnimationFrame(animate);
//find the selected object on the fabric canvas
let selected = canvas.getActiveObject();
//hide controles and render on the fabric canvas;
if (selected){
selected.hasControls = false;
selected.hasBorders = false;
canvas.renderAll();
}
//update texture and render
texture.needsUpdate = true;
renderer.render(scene, camera);
//show controls and render on the fabric canvas
if (selected){
selected.hasControls = true;
selected.hasBorders = true;
canvas.renderAll();
}
}
第二个问题有点难以理解。我不确定“下部帆布”是什么,以及它是否是我不理解的织物的一部分。这是我能得到的最接近的。我几乎让它在 three.js 渲染器上工作。如果我理解正确的话......
你需要有一个变量来知道你是否按下了鼠标。只有当您按下鼠标并移动鼠标时,它才会画一个圆圈。
要对织物“鼠标:移动”做同样的事情,您至少必须禁用织物画布上的选择框。但我不知道这在织物中是如何工作的。
var raycaster = new THREE.Raycaster();
var mouse = new THREE.Vector2();
var mouseDown = false;///////////////////////////// global boolean
var onClickPosition = new THREE.Vector2();
container.addEventListener("mousedown", function(){
mouseDown = true;
canvas.selection = false;
onMouseEvt(); //draw circle
}, false);
container.addEventListener("mouseup", function(){
mouseDown = false
canvas.selection = true;
}, false);
container.addEventListener("mousemove", function(e){
if (mouseDown){
onMouseEvt(); //draw circle
}
}, false);
///This code does not work, it goes into selection mode..
canvas.on('mouse:down', function(){
mouseDown = true;
addCircle();
}, false);
canvas.on('mouse:up', function(){
mouseDown = false;
}, false);
canvas.on('mouse:move', function(){
if ( mouseDown ){
addCircle();
}
}, false);