2015-08-05 4 views
0

В этом уроке: https://www.khanacademy.org/computing/computer-programming/programming-games-visualizations/programming-3d-shapes/a/rotating-3d-shapes показано, как создавать 3d-фигуры и вращать их. Я следовал шаги, воссоздающий все в JavaScript вместо Processing.js, но не может по каким-то причинам сделать эти функции (в JavaScript):Как я могу сделать эти функции processing.js в javascript?

var rotateY3D = function(theta) { 
    var sinTheta = sin(theta); 
    var cosTheta = cos(theta); 
    for (var n = 0; n < nodes.length; n++) { 
     var node = nodes[n]; 
     var x = node[0]; 
     var z = node[2]; 
     node[0] = x * cosTheta - z * sinTheta; 
     node[2] = z * cosTheta + x * sinTheta; 
    } 
}; 

Это была моя попытка:

var rotateZ3D = function (theta) { 
     var sinTheta = Math.sin(theta); 
     var cosTheta = Math.cos(theta); 
     for (var n = 0; n<nodes.length; n++) { 

      var x = nodes[n][0]; 
      var y = nodes[n][1]; 
      nodes[n][0] = x * cosTheta - y * sinTheta; 
      nodes[n][1] = y * cosTheta + x * sinTheta; 
     } 
} 

Мог бы кто-нибудь сказать мне, что я делаю неправильно, или если мне нужно пойти по этому поводу по-другому?

+0

выглядит как хан-академия использует '' sin' и реализации cos' что получайте градусы как параметры, «Math.sin» и «Math.cos» получают радианы. Угадайте, что вы получаете какие-то нелепые результаты =) – Prusse

+0

Ох, это параметр тета, который всегда меняется, когда я перетаскиваю мышью? – Axeowny

+0

'mouseDragged = function() {rotateY3D (mouseX - pmouseX); rotateX3D (mouseY - pmouseY); }; это «размер» движения мыши. Также обратите внимание, что исходное значение изменено и потеряно. – Prusse

ответ

0

Проблема первоначально заключалась в использовании функций «sin» и «cos». Ваш theta был в градусах, а встроенные в javascript - радиан.

(При необходимости детали преобразования можно найти в комментариях вопрос)

После фиксации, что проблема была с окружающим кодом.

(Вот скрипка с кодом: http://jsfiddle.net/bvqswvnL/1/)

первого увидеть какие результаты вращения следует вызвать функцию draw ПОСЛЕ rotateZ3D один.

Чтобы показать результат (а функция работает) Я добавил setInterval поэтому точка постоянно повернуты и рисовать.

также:

  • Добавлен board.restore(); до конца функции так преобразования не «накапливаются» draw;
  • Изменено board.lineTo(node1[1], node1[1]) к board.lineTo(node1[0], node1[1]) (думает, это было действительное намерение;

(Вот скрипка с результатом http://jsfiddle.net/bvqswvnL/2/)

+0

Это сработало, и я очень благодарен; но я наткнулся на большую проблему. Теперь, когда я перешел к следующему шагу (3d-фигура генерирует функции кубоидов вместо фиксированных значений рисования для узлов, краев и т. Д.), Но мой код полностью выводит сумасшедшую форму. Вот новый код: http://pastebin.com/T23HYGMP Я создал функцию createCuboid, которая заменила массивы узлов и ребер (и ее значения) данными параметров, которые подталкивают к возможности создавать кубики, но вам нравится, но они выходят что-то сумасшедшее. Спасибо за помощь раньше! – Axeowny

+0

Проблема заключается в вашей функции 'createCuboid'. У вас есть «узлы» в порядке, но неправильно создаются края. – Prusse

+0

Я исправил его, соединив края с разными узлами, но почему я это делаю? Если он работал с первым при подключении этих узлов друг к другу, почему это не было? Я изменил ребра массивов от того, что я имел на pastebin к этому: [0, 1], [3,5], [3, 0], [2, 0], [4, 7], [5, 7] , [7, 6], [2, 4], [1, 4], [1, 5], [2, 6], [3, 6] – Axeowny