Вращающийся холст о проблемах оси

Я использую холст 3d, чтобы нарисовать 3D-график, на котором я могу построить точки, такие как (1,5,4), (-8,6, -2) и т. Д. Так что я могу нарисовать все положительные и отрицательные х, Ось Y и Z. У меня также есть эффект вращения с помощью клавиш со стрелками. Инструкции по вращению: ось Z проходит от центра экрана.

Для поворота вокруг оси x нажимайте клавиши со стрелками вверх / вниз. Чтобы повернуть вокруг оси Y, нажмите клавиши со стрелками влево / вправо. Для поворота вокруг оси z нажмите клавиши со стрелками ctrl + left / ctrl + down.

Я могу построить точку, указав точки в предоставленном мною текстовом поле. Теперь проблема в том, что, например, если я построю график (5,5,2), он будет построен правильно. Но если я сначала поверну ось X, а затем ось Y, то точка будет построена правильно. Проблема возникает, если я сначала поверну ось Y, а затем ось X. Точка будет построена неправильно. Простой способ найти проблему, с которой я столкнулся: это можно легко определить, если вы продолжаете строить одну и ту же точку несколько раз. Точка должна быть нанесена выше одной и той же точки, чтобы была видна только одна точка. Но в моем случае та же самая точка ( Например, (5,5,2) рисуется в другом месте на холсте при вращении. Эта проблема возникает, только если я сначала поворачиваю ось Y, а затем ось X или если я сначала поворачиваю ось Z, а затем ось Y. это ошибка, которую я сделал в кодировании. Я новичок в этом холсте 3d и java-скрипте. Так что, пожалуйста, помогите.



 

Canvas Surface Rotation



  body {

    text-align: center;

  }



  canvas {

    border: 1px solid black;

  }



  

var p1;
var p2;
var p3;
var p4;
var p5;
var p6;
var xangle=0;
var yangle=0;
var zangle=0;
  var constants = {

    canvasWidth: 600, // In pixels.

    canvasHeight: 600, // In pixels.

    leftArrow: 37,

    upArrow: 38,

    rightArrow: 39,

    downArrow: 40,

    xMin: -10, // These four max/min values define a square on the xy-plane that the surface will be plotted over.

    xMax: 10,

    yMin: -10,

    yMax: 10, 

    xDelta: 0.06, // Make smaller for more surface points. 

    yDelta: 0.06, // Make smaller for more surface points. 

    colorMap: ["#000080"], // There are eleven possible "vertical" color values for the surface, based on the last row of http://www.cs.siena.edu/~lederman/truck/AdvanceDesignTrucks/html_color_chart.gif

    pointWidth: 2, // The size of a rendered surface point (i.e., rectangle width and height) in pixels.

    dTheta: 0.05, // The angle delta, in radians, by which to rotate the surface per key press.

    surfaceScale: 24 // An empirically derived constant that makes the surface a good size for the given canvas size.

  };



  // These are constants too but I've removed them from the above constants literal to ease typing and improve clarity.

  var X = 0;

  var Y = 1;

  var Z = 2;



  // -----------------------------------------------------------------------------------------------------  



  var controlKeyPressed = false; // Shared between processKeyDown() and processKeyUp().

  var surface = new Surface(); // A set of points (in vector format) representing the surface.



  // -----------------------------------------------------------------------------------------------------



  function point(x, y, z)

  /*

    Given a (x, y, z) surface point, returns the 3 x 1 vector form of the point.

  */

  {       

    return [x, y, z]; // Return a 3 x 1 vector representing a traditional (x, y, z) surface point. This vector form eases matrix multiplication.

  }



  // -----------------------------------------------------------------------------------------------------



  function Surface()

  /*

    A surface is a list of (x, y, z) points, in 3 x 1 vector format. This is a constructor function.

  */

  {

    this.points = [];
    // An array of surface points in vector format. That is, each element of this array is a 3 x 1 array, as in [ [x1, y1, z1], [x2, y2, z2], [x3, y3, z3], ... ]

  }



  // -----------------------------------------------------------------------------------------------------  



  Surface.prototype.equation = function(x, y)

  /*

    Given the point (x, y), returns the associated z-coordinate based on the provided surface equation, of the form z = f(x, y).

  */

  {

    var d = Math.sqrt(x*x + y*y); // The distance d of the xy-point from the z-axis.



    return 4*(Math.sin(d) / d); // Return the z-coordinate for the point (x, y, z). 

  }



  // -----------------------------------------------------------------------------------------------------  



  Surface.prototype.generate = function()

  /*

    Creates a list of (x, y, z) points (in 3 x 1 vector format) representing the surface.

  */

  {

    var i = 0;



    for (var x = constants.xMin; x 

Ответы на вопрос(2)

Ваш ответ на вопрос