2013-02-22 119 views
1

我使用画布3D绘制一个三维图形,其中我可以绘制诸如(1,5,4),(-8,6,-2)等点。所以我能够绘制所有正,负x,y和z轴。使用箭头键还可以获得旋转效果。 旋转指令: z轴从屏幕中心向外延伸。关于轴问题的旋转画布

要绕X轴旋转,请按向上/向下箭头键。 要围绕y轴旋转,请按左/右箭头键。 要围绕z轴旋转,请按Ctrl +左/ Ctrl +向下箭头键。

我可以通过指定我提供的文本字段中的点来绘制点。 现在的问题是,例如,如果我绘制(5,5,2)它会正确绘制。但如果我先旋转X轴然后Y轴然后点将被正确绘制。如果我先旋转Y轴然后再旋转X轴,问题就出现了。这个点会被错误地绘制出来。 简单的方法来找到我遇到的问题: 这可以很容易地找出,如果你反复绘制相同的点。点应绘制在同一点上方,以便只有单一点是可见的。但在我的情况下点(对于ex(5,5,2)在画布中的不同位置绘制,而旋转。此问题仅适用于如果我先旋转y轴然后再旋转x轴或如果我先旋转z轴然后再旋转y轴。那么,什么是我在做coding.I错误是新来这个帆布3D和java script.So请帮助。

<html> 

<head> 
<script src="http://code.jquery.com/jquery-latest.min.js"></script> 
<title>Canvas Surface Rotation</title> 

<style> 

    body { 

    text-align: center; 

    } 



    canvas { 

    border: 1px solid black; 

    } 

</style> 

<script> 

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 <= constants.xMax; x += constants.xDelta) 

    { 

     for (var y = constants.yMin; y <= constants.yMax; y += constants.yDelta) 

     { 

     this.points[i] = point(x, y, this.equation(x, y)); // Store a surface point (in vector format) into the list of surface points.    

     ++i; 

     } 

    } 

    } 



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



    Surface.prototype.color = function() 

    /* 

    The color of a surface point is a function of its z-coordinate height. 

    */ 

    { 

    var z; // The z-coordinate for a given surface point (x, y, z). 



    this.zMin = this.zMax = this.points[0][Z]; // A starting value. Note that zMin and zMax are custom properties that could possibly be useful if this code is extended later. 

    for (var i = 0; i < this.points.length; i++) 

    {    

     z = this.points[i][Z]; 

     if (z < this.zMin) { this.zMin = z; } 

     if (z > this.zMax) { this.zMax = z; } 

    } 



    var zDelta = Math.abs(this.zMax - this.zMin)/constants.colorMap.length; 



    for (var i = 0; i < this.points.length; i++) 

    { 

     this.points[i].color = constants.colorMap[ Math.floor((this.points[i][Z]-this.zMin)/zDelta) ]; 

    } 



    /* Note that the prior FOR loop is functionally equivalent to the follow (much less elegant) loop:  

    for (var i = 0; i < this.points.length; i++) 

    { 

     if (this.points[i][Z] <= this.zMin + zDelta) {this.points[i].color = "#060";} 

     else if (this.points[i][Z] <= this.zMin + 2*zDelta) {this.points[i].color = "#090";} 

     else if (this.points[i][Z] <= this.zMin + 3*zDelta) {this.points[i].color = "#0C0";} 

     else if (this.points[i][Z] <= this.zMin + 4*zDelta) {this.points[i].color = "#0F0";} 

     else if (this.points[i][Z] <= this.zMin + 5*zDelta) {this.points[i].color = "#9F0";} 

     else if (this.points[i][Z] <= this.zMin + 6*zDelta) {this.points[i].color = "#9C0";} 

     else if (this.points[i][Z] <= this.zMin + 7*zDelta) {this.points[i].color = "#990";} 

     else if (this.points[i][Z] <= this.zMin + 8*zDelta) {this.points[i].color = "#960";} 

     else if (this.points[i][Z] <= this.zMin + 9*zDelta) {this.points[i].color = "#930";} 

     else if (this.points[i][Z] <= this.zMin + 10*zDelta) {this.points[i].color = "#900";}   

     else {this.points[i].color = "#C00";} 

    } 

    */ 

    } 



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

    function update(){ 
document.querySelector("#xa").innerHTML = xangle; 
document.querySelector("#ya").innerHTML = yangle; 
document.querySelector("#za").innerHTML = zangle; 
} 

    function appendCanvasElement() 

    /* 

    Creates and then appends the "myCanvas" canvas element to the DOM. 

    */ 

    { 

    var canvasElement = document.createElement('canvas'); 



    canvasElement.width = constants.canvasWidth; 

    canvasElement.height = constants.canvasHeight; 

    canvasElement.id = "myCanvas"; 



    canvasElement.getContext('2d').translate(constants.canvasWidth/2, constants.canvasHeight/2); // Translate the surface's origin to the center of the canvas. 



    document.body.appendChild(canvasElement); // Make the canvas element a child of the body element. 

    } 



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

    Surface.prototype.sortByZIndex = function(A, B) 

    { 

    return A[Z] - B[Z]; // Determines if point A is behind, in front of, or at the same level as point B (with respect to the z-axis). 

    } 



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



    Surface.prototype.draw = function() 

    { 

    var myCanvas = document.getElementById("myCanvas"); // Required for Firefox. 

    var ctx = myCanvas.getContext("2d"); 
    var res; 
    var xm; 


    // this.points = surface.points.sort(surface.sortByZIndex); // Sort the set of points based on relative z-axis position. If the points are visibly small, you can sort of get away with removing this step. 


    for (var i = 0; i < this.points.length; i++) 

    { 

     ctx.fillStyle = this.points[i].color; 

     ctx.fillRect(this.points[i][X] * constants.surfaceScale, this.points[i][Y] * constants.surfaceScale, constants.pointWidth, constants.pointWidth); 


    }  

var c=document.getElementById("myCanvas"); 
var ctx=c.getContext("2d"); 
ctx.font="12px Arial"; 
ctx.fillStyle = "#000000"; 
ctx.fillText("X",this.points[p1][X] * constants.surfaceScale, this.points[p1][Y] * constants.surfaceScale); 
var c=document.getElementById("myCanvas"); 
var ctx1=c.getContext("2d"); 
ctx1.font="12px Arial"; 
ctx1.fillText("Y",this.points[p2][X] * constants.surfaceScale, this.points[p2][Y] * constants.surfaceScale); 
var c=document.getElementById("myCanvas"); 
var ctx1=c.getContext("2d"); 
ctx1.font="12px Arial"; 
ctx1.fillText("Z",this.points[p3][X] * constants.surfaceScale, this.points[p3][Y] * constants.surfaceScale); 

var c=document.getElementById("myCanvas"); 
var ctx1=c.getContext("2d"); 
ctx1.font="12px Arial"; 
ctx1.fillText("-Y",this.points[p4][X] * constants.surfaceScale, this.points[p4][Y] * constants.surfaceScale); 

var c=document.getElementById("myCanvas"); 
var ctx1=c.getContext("2d"); 
ctx1.font="12px Arial"; 
ctx1.fillText("-Z",this.points[p5][X] * constants.surfaceScale, this.points[p5][Y] * constants.surfaceScale); 

var c=document.getElementById("myCanvas"); 
var ctx1=c.getContext("2d"); 
ctx1.font="12px Arial"; 
ctx1.fillText("-X",this.points[p6][X] * constants.surfaceScale, this.points[p6][Y] * constants.surfaceScale); 


    } 



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



    Surface.prototype.multi = function(R) 

    /* 

    Assumes that R is a 3 x 3 matrix and that this.points (i.e., P) is a 3 x n matrix. This method performs P = R * P. 

    */ 

    { 

    var Px = 0, Py = 0, Pz = 0; // Variables to hold temporary results. 

    var P = this.points; // P is a pointer to the set of surface points (i.e., the set of 3 x 1 vectors). 

    var sum; // The sum for each row/column matrix product. 



    for (var V = 0; V < P.length; V++) // For all 3 x 1 vectors in the point list. 

    { 

     Px = P[V][X], Py = P[V][Y], Pz = P[V][Z]; 

     for (var Rrow = 0; Rrow < 3; Rrow++) // For each row in the R matrix. 

     { 

     sum = (R[Rrow][X] * Px) + (R[Rrow][Y] * Py) + (R[Rrow][Z] * Pz); 

     P[V][Rrow] = sum; 

     } 

    }  

    } 
Surface.prototype.multipt = function(R) 

    /* 

    Assumes that R is a 3 x 3 matrix and that this.points (i.e., P) is a 3 x n matrix. This method performs P = R * P. 

    */ 

    { 

    var Px = 0, Py = 0, Pz = 0; // Variables to hold temporary results. 

    var P = this.points; // P is a pointer to the set of surface points (i.e., the set of 3 x 1 vectors). 

    var sum; // The sum for each row/column matrix product. 



    for (var V = P.length-1; V < P.length; V++) // For all 3 x 1 vectors in the point list. 

    { 

     Px = P[V][X], Py = P[V][Y], Pz = P[V][Z]; 

     for (var Rrow = 0; Rrow < 3; Rrow++) // For each row in the R matrix. 

     { 

     sum = (R[Rrow][X] * Px) + (R[Rrow][Y] * Py) + (R[Rrow][Z] * Pz); 

     P[V][Rrow] = sum; 

     } 

    }  

    } 



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



    Surface.prototype.erase = function() 

    { 

    var myCanvas = document.getElementById("myCanvas"); // Required for Firefox. 

    var ctx = myCanvas.getContext("2d"); 



    ctx.clearRect(-constants.canvasWidth/2, -constants.canvasHeight/2, myCanvas.width, myCanvas.height); 

    } 



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



    Surface.prototype.xRotate = function(sign) 

    /* 

    Assumes "sign" is either 1 or -1, which is used to rotate the surface "clockwise" or "counterclockwise". 

    */ 

    { 

    var Rx = [ [0, 0, 0], 

       [0, 0, 0], 

       [0, 0, 0] ]; // Create an initialized 3 x 3 rotation matrix. 



    Rx[0][0] = 1; 

    Rx[0][1] = 0; // Redundant but helps with clarity. 

    Rx[0][2] = 0; 

    Rx[1][0] = 0; 

    Rx[1][1] = Math.cos(sign*constants.dTheta); 

    Rx[1][2] = -Math.sin(sign*constants.dTheta); 

    Rx[2][0] = 0; 

    Rx[2][1] = Math.sin(sign*constants.dTheta); 

    Rx[2][2] = Math.cos(sign*constants.dTheta); 



    this.multi(Rx); // If P is the set of surface points, then this method performs the matrix multiplcation: Rx * P 

    this.erase(); // Note that one could use two canvases to speed things up, which also eliminates the need to erase. 

    this.draw(); 

    } 



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



    Surface.prototype.yRotate = function(sign) 

    /* 

    Assumes "sign" is either 1 or -1, which is used to rotate the surface "clockwise" or "counterclockwise". 

    */  

    { 

    var Ry = [ [0, 0, 0], 

       [0, 0, 0], 

       [0, 0, 0] ]; // Create an initialized 3 x 3 rotation matrix. 



    Ry[0][0] = Math.cos(sign*constants.dTheta); 

    Ry[0][1] = 0; // Redundant but helps with clarity. 

    Ry[0][2] = Math.sin(sign*constants.dTheta); 

    Ry[1][0] = 0; 

    Ry[1][1] = 1; 

    Ry[1][2] = 0; 

    Ry[2][0] = -Math.sin(sign*constants.dTheta); 

    Ry[2][1] = 0; 

    Ry[2][2] = Math.cos(sign*constants.dTheta); 



    this.multi(Ry); // If P is the set of surface points, then this method performs the matrix multiplcation: Rx * P 

    this.erase(); // Note that one could use two canvases to speed things up, which also eliminates the need to erase. 

    this.draw(); 

    } 



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



    Surface.prototype.zRotate = function(sign) 

    /* 

    Assumes "sign" is either 1 or -1, which is used to rotate the surface "clockwise" or "counterclockwise". 

    */  

    { 

    var Rz = [ [0, 0, 0], 

       [0, 0, 0], 

       [0, 0, 0] ]; // Create an initialized 3 x 3 rotation matrix. 



    Rz[0][0] = Math.cos(sign*constants.dTheta); 

    Rz[0][1] = -Math.sin(sign*constants.dTheta);   

    Rz[0][2] = 0; // Redundant but helps with clarity. 

    Rz[1][0] = Math.sin(sign*constants.dTheta); 

    Rz[1][1] = Math.cos(sign*constants.dTheta); 

    Rz[1][2] = 0; 

    Rz[2][0] = 0 

    Rz[2][1] = 0; 

    Rz[2][2] = 1; 



    this.multi(Rz); // If P is the set of surface points, then this method performs the matrix multiplcation: Rx * P 

    this.erase(); // Note that one could use two canvases to speed things up, which also eliminates the need to erase. 

    this.draw(); 

    } 


Surface.prototype.xRotatept = function() 

    { 

    var Rx = [ [0, 0, 0], 

       [0, 0, 0], 

       [0, 0, 0] ]; 



    Rx[0][0] = 1; 

    Rx[0][1] = 0; 

    Rx[0][2] = 0; 

    Rx[1][0] = 0; 

    Rx[1][1] = Math.cos(xangle); 

    Rx[1][2] = -Math.sin(xangle); 

    Rx[2][0] = 0; 

    Rx[2][1] = Math.sin(xangle); 

    Rx[2][2] = Math.cos(xangle); 


    this.multipt(Rx); 

    this.erase(); 

    this.draw(); 

    } 




    Surface.prototype.yRotatept = function() 


    { 

    var Ry = [ [0, 0, 0], 

       [0, 0, 0], 

       [0, 0, 0] ]; 



    Ry[0][0] = Math.cos(yangle); 

    Ry[0][1] = 0; 

    Ry[0][2] = Math.sin(yangle); 

    Ry[1][0] = 0; 

    Ry[1][1] = 1; 

    Ry[1][2] = 0; 

    Ry[2][0] = -Math.sin(yangle); 

    Ry[2][1] = 0; 

    Ry[2][2] = Math.cos(yangle); 



    this.multipt(Ry); 

    this.erase(); 

    this.draw(); 

    } 




    Surface.prototype.zRotatept = function() 



    { 

    var Rz = [ [0, 0, 0], 

       [0, 0, 0], 

       [0, 0, 0] ]; 



    Rz[0][0] = Math.cos(zangle); 

    Rz[0][1] = -Math.sin(zangle);   

    Rz[0][2] = 0; 

    Rz[1][0] = Math.sin(zangle); 

    Rz[1][1] = Math.cos(zangle); 

    Rz[1][2] = 0; 

    Rz[2][0] = 0 

    Rz[2][1] = 0; 

    Rz[2][2] = 1; 



    this.multipt(Rz); 

    this.erase(); 

    this.draw(); 

    } 




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



    function processKeyDown(evt) 

    {      

    if (evt.ctrlKey) 

    { 

     switch (evt.keyCode) 

     { 

     case constants.upArrow: 

      // No operation other than preventing the default behavior of the arrow key. 

      evt.preventDefault(); // This prevents the default behavior of the arrow keys, which is to scroll the browser window when scroll bars are present. The user can still scroll the window with the mouse.    

      break; 

     case constants.downArrow: 

      // No operation other than preventing the default behavior of the arrow key. 

      evt.preventDefault(); 

      break; 

     case constants.leftArrow: 

      // console.log("ctrl+leftArrow"); 
       zangle=zangle-0.05; 
       update(); 
     if(zangle<=-2*Math.PI) 
     { 
      zangle=0; 

     } 
      surface.zRotate(-1); // The sign determines if the surface rotates "clockwise" or "counterclockwise". 

      evt.preventDefault(); 

      break; 

     case constants.rightArrow: 

      // console.log("ctrl+rightArrow"); 
      zangle=zangle+0.05; 
      update(); 
     if(zangle>=2*Math.PI) 
     { 
      zangle=0; 

     } 
      surface.zRotate(1); 

      evt.preventDefault(); 

      break; 

     } 

     return; // When the control key is pressed, only the left and right arrows have meaning, no need to process any other key strokes (i.e., bail now). 

    } 



    // Assert: The control key is not pressed. 



    switch (evt.keyCode) 

    { 

     case constants.upArrow: 

     // console.log("upArrow"); 

     xangle=xangle+0.05; 
     update(); 
     if(xangle>=2*Math.PI) 
     { 
      xangle=0; 

     } 

     surface.xRotate(1); 

     evt.preventDefault(); 

     break; 

     case constants.downArrow: 

     // console.log("downArrow"); 
     xangle=xangle-0.05; 
     update(); 
     if(xangle<=-2*Math.PI) 
     { 

      xangle=0; 
     } 

     surface.xRotate(-1); 

     evt.preventDefault(); 

     break; 

     case constants.leftArrow: 

     // console.log("leftArrow"); 
     yangle=yangle-0.05; 
     update(); 
     if(yangle<=-2*Math.PI) 
     { 
      yangle=0; 

     } 
     surface.yRotate(-1); 

     evt.preventDefault(); 

     break; 

     case constants.rightArrow: 

     // console.log("rightArrow"); 
     yangle=yangle+0.05; 
     update(); 
     if(yangle>=2*Math.PI) 
     { 
      yangle=0; 

     } 
     surface.yRotate(1); 

     evt.preventDefault(); 

     break; 

    } 

    } 



    // ----------------------------------------------------------------------------------------------------- 
Surface.prototype.plot = function(x, y, z) 
    /* 
    add the point (x, y, z) (in 3 x 1 vector format) to the surface. 
    */ 
    { 

     this.points.push(point(x, y, z)); // Store a surface point 
     var x=0; 
     for (var x = constants.xMin; x <= constants.xMax; x += constants.xDelta) 
     { 
     this.points.push(point(x, 0, 0)); 
     } 
     p6=1; 
     p1=this.points.length-1; 
     p4=this.points.length; 
     /*var y=-0.2 
     for (var x = constants.xMax+1; x <= constants.xMax+2; x += constants.xDelta) 
     { 
     this.points.push(point(x, y, 0)); 
     y=y+0.002 
     }*/ 

     /*for (var x = constants.xMax+1; x <= constants.xMax+2; x += constants.xDelta) 
     { 
     this.points.push(point(11, 0, 0)) 
     }*/ 
     for (var x = constants.xMin; x <= constants.xMax; x += constants.yDelta) 
     { 
     this.points.push(point(0, x, 0)); 
     } 
     p2=this.points.length-1; 
     p5=this.points.length; 
     for (var x = constants.xMin; x <= constants.xMax; x += constants.yDelta) 
     { 
     this.points.push(point(0,0,x)); 
     } 
     p3=this.points.length-1; 

    } 
    Surface.prototype.plot1 = function(x, y, z) 
    /* 
    add the point (x, y, z) (in 3 x 1 vector format) to the surface. 
    */ 
    {  


     this.points.push(point(x, y, z)); // Store a surface point 
    surface.xRotatept(); 
    surface.yRotatept(); 

    surface.zRotatept(); 
     this.draw(); 

    } 


    function onloadInit() 

    { 

    appendCanvasElement(); // Create and append the canvas element to the DOM. 

    surface.draw(); // Draw the surface on the canvas. 

    document.addEventListener('keydown', processKeyDown, false); // Used to detect if the control key has been pressed. 

    } 



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




    //surface.generate(); // Creates the set of points reprsenting the surface. Must be called before color(). 
surface.plot(0,0,0); 
    surface.color(); // Based on the min and max z-coordinate values, chooses colors for each point based on the point's z-ccordinate value (i.e., height). 

    window.addEventListener('load', onloadInit, false); // Perform processing that must occur after the page has fully loaded. 

    </script> 

</head> 

    <body> 
<table align="center"> 
<tr><td> 
<h5 style="color:#606">Enter the value of (X,Y,Z)</h5> 
      <input type="text" value="5" class="num-input" width="50" size="2" id="x-input"> 
      <input type="text" value="5" class="num-input" width="50" size="2" id="y-input"> 
      <input type="text" value="2" class="num-input" width="50" size="2" id="z-input"> 
      <input type="button" value="Plot Point" onClick="surface.plot1(document.getElementById('x-input').value,document.getElementById('y-input').value,document.getElementById('z-input').value); "> 

      </td></tr></table> 
<table align="center"> <tr><td> 
<span id="xa">0</span>deg<br> 
<span id="ya">0</span>deg<br> 
<span id="za">0</span>deg</td></tr></table> 
</body> 

</html> 
+0

是的,我bwroga纠正。您需要将所有旋转累加到一个最终的变换矩阵中。这里是一个关于3D旋转和它们变换矩阵的非常好的教程 - http://www.html5rocks.com/en/tutorials/webgl/webgl_orthographic_3d/ – markE 2013-02-22 18:39:08

回答

1

旋转沿多轴最终输出可以根据订单有所不同,你旋转轴',你需要做的是记录沿着eac的总旋转h轴(如三个数字,不使用矩阵)。每次更新旋转值时,将所有三个总旋转以正确的顺序应用于单位矩阵(尝试x,y,z)。始终使用相同的顺序。然后使用它来转换你的坐标。

+0

现在我将沿着每个x,y和z轴的旋转角度存储起来在单独的变量,然后我沿着x应用旋转矩阵,然后y然后z.Is这正确的是我在做什么? – Navaneet 2013-02-23 04:47:50

+0

@Navaneet这应该是正确的。每次应用旋转之前,请不要忘记将旋转矩阵重置为单位矩阵。 – bwroga 2013-02-23 05:27:24

+0

我所做的就是在xyz平面或图形上绘制一个点,然后像我想要的那样旋转。在旋转过程中,我会跟踪为x,y,z轴旋转的角度。然后,如果绘制一个新点,那么我不会重置x,y和z轴,而是将该点绘制在处于某种旋转模式的同一平面上。什么可能是旋转的顺序我做了旋转矩阵的那一点关于x轴先x轴然后y最后z。但我仍然有错误。另外,在围绕一个轴旋转时,我只能跟踪该轴的角度旋转。是这样吗? – Navaneet 2013-02-23 05:43:05

0

这里是我的意见:

JAVASCRIPT

var canvas = document.getElementById("myCanvas"); 
var ctx2 = canvas.getContext("2d"); 
ctx2.fillStyle='#333'; 

ctx2.fillRect(50,50,100,100); 
var ctx = canvas.getContext("2d"); 


ctx.fillStyle='red'; 

var deg = Math.PI/180; 

ctx.save(); 
    ctx.translate(100, 100); 
    ctx.rotate(45 * deg); 
    ctx.fillRect(-50,-50,100,100); 
ctx.restore(); 

ctx2是旧的位置和CTX是形状的新位置。根据要定位形状的位置,必须使用相同的x,y坐标来转换形状。然后你必须输入值为ctx.fillRect(x,y,w,h);保留x和y作为-ve值(高度和宽度的一半以保持在画布的对角线上,否则改为操纵它)。和h,w作为你想要的值。

DEMO