JavaScript рисует с помощью мыши Canvas с 3 осями

Как это / можно нарисовать с помощью мыши холст, используя 3 оси (x,y,z).

Я знаю, что можно нарисовать холст на 2 осях, и я сделал это успешно.

Но я понятия не имею, как я нарисую его на 3 оси (например, куб).

Ниже показаны некоторые функции рисования на холсте.

$(canvas).on('mousemove', function(e) {
mousex = parseInt(e.clientX-canvasx);
mousey = parseInt(e.clientY-canvasy);
if(mousedown) {
    ctx.beginPath();
    if(tooltype=='draw') {
        ctx.globalCompositeOperation = 'source-over';
        ctx.strokeStyle = 'black';
        ctx.lineWidth = 3;
    } else {
        ctx.globalCompositeOperation = 'destination-out';
        ctx.lineWidth = 10;
    }
    ctx.moveTo(last_mousex,last_mousey);
    ctx.lineTo(mousex,mousey);
    ctx.lineJoin = ctx.lineCap = 'round';
    ctx.stroke();
}
last_mousex = mousex;
last_mousey = mousey;
//Output
$('#output').html('current: '+mousex+', '+mousey+'<br/>last: '+last_mousex+', '+last_mousey+'<br/>mousedown: '+mousedown);

});

Полный код https://jsfiddle.net/ArtBIT/kneDX/.

Но как я могу добавить ось z и нарисовать 3D-холст, например, куб.

3 ответа

С 2D это просто, у вас есть координаты X и Y мыши, и когда вы нажимаете кнопку мыши, вы можете изменить пиксели в этом месте на холсте.

3D с другой стороны довольно сложно. Из-за дополнительного измерения, которого нет на 2D-поверхности, вам необходимо знать, как управлять 3D-позициями. И что еще хуже, с этим третьим измерением приходят всевозможные дополнительные элементы, которые все любят иметь: молнии и тени, эффекты, фокусировка и т. Д.

Простое рисование

В своей основной форме (за исключением некоторой арифметики) вы можете выровнять ось Z на 2D-поверхности с помощью одного деления. Предположим, что у вас есть точка в 3D, которая состоит из трех точек на трех осях (x3d, y3d, z3d), тогда вы можете сделать:

var x2d = x3d / z3d;
var y2d = y3d / z3d;

Если вы новичок в 3D, вы сначала захотите поиграть с этим. Вот учебник.

Продвинутый рисунок

Только для частиц и линий это довольно просто, хотя вы можете использовать другую точку зрения. Но вскоре это становится сложнее, когда вы используете объекты и хотите повернуть их в трехмерном пространстве. Вот почему большинство людей используют 3D-движок для создания 3D-графики.

Управление 3D пространством

При рисовании с помощью мыши вам необходимо отобразить движение 2D мыши на 3D для контроля. Для примера посмотрите эти 3D GUI: Microsoft Paint 3D, Google Sketchup и Blender. Обратите внимание, что чем больше видов отображений необходимо реализовать (например, масштабирование и другие преобразования), тем больше математики требуется.

Использование three.js поможет вам. Смотрите здесь: https://jsfiddle.net/bn890dtc/

Основной код для рисования линии по щелчку и перетаскиванию:

function onMouseMove(evt) {
    if (renderer) {

        var x = (event.clientX / window.innerWidth) * 2 - 1;
        var y = -(event.clientY / window.innerHeight) * 2 + 1;
        var z = 0
        var vNow = new THREE.Vector3(x, y, z);

        vNow.unproject(camera);
        splineArray.push(vNow);

    }
}

Линия

vNow.unproject(camera);

спроецирует ваш рисунок в трехмерное пространство.

Эта функция обновит линию в трехмерном пространстве:

function updatePositions() {

    var positions = line.geometry.attributes.position.array;

    var index = 0;

        for ( var i = 0; i < splineArray.length;  i ++ ) {

        positions[ index ++ ] = splineArray[i].x;
        positions[ index ++ ] = splineArray[i].y;
        positions[ index ++ ] = splineArray[i].z;


        }
}
<html>
<head>
<title>3D Cube</title>
<style>canvas { width: 100%; height: 100% }</style>
</head>
<body>
<script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/85/three.min.js"></script>
<script>
var scene = new THREE.Scene();
var camera = new THREE.PerspectiveCamera(75, window.innerWidth/window.innerHeight, 1, 10000);
var renderer = new THREE.WebGLRenderer();
renderer.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(renderer.domElement);
var geometry = new THREE.BoxGeometry(700, 700, 700, 10, 10, 10);
var material = new THREE.MeshBasicMaterial({color: 0xfffff, wireframe: true});
var cube = new THREE.Mesh(geometry, material);
scene.add(cube);
camera.position.z = 1000;        
function render() {
requestAnimationFrame(render);
cube.rotation.x += 0.01;
cube.rotation.y += 0.01;
renderer.render(scene, camera);
};
render();
</script>
</body>
</html>

https://github.com/AshokKnv/3D-Cube/blob/master/explanation.txt

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