请问各位高手:
在3维空间中给定两个点,可以得到一条空间向量。
请问如何得沿该方向绘制一个圆柱?(具体位置在哪无所谓,只圆柱的轴线和该方向一致)
换句话说,如何通过一个方向向量,得到一个相对于原坐标系(x: right, y: up, z: back)的旋转矩阵?
谢谢!

解决方案 »

  1.   

    我以前写过:
    void RenderBone(float x0, float y0, float z0, float x1, float y1, float z1 )
    {
    GLdouble  dir_x = x1 - x0;
    GLdouble  dir_y = y1 - y0;
    GLdouble  dir_z = z1 - z0;
    GLdouble  bone_length = sqrt( dir_x*dir_x + dir_y*dir_y + dir_z*dir_z );
    static GLUquadricObj *  quad_obj = NULL;
    if ( quad_obj == NULL )
    quad_obj = gluNewQuadric();
    gluQuadricDrawStyle( quad_obj, GLU_FILL );
    gluQuadricNormals( quad_obj, GLU_SMOOTH ); glPushMatrix();
    glTranslated( x0, y0, z0 );
    double  length;
    length = sqrt( dir_x*dir_x + dir_y*dir_y + dir_z*dir_z );
    if ( length < 0.0001 ) { 
    dir_x = 0.0; dir_y = 0.0; dir_z = 1.0;  length = 1.0;
    }
    dir_x /= length;  dir_y /= length;  dir_z /= length;
    GLdouble  up_x, up_y, up_z;
    up_x = 0.0;
    up_y = 1.0;
    up_z = 0.0;
    double  side_x, side_y, side_z;
    side_x = up_y * dir_z - up_z * dir_y;
    side_y = up_z * dir_x - up_x * dir_z;
    side_z = up_x * dir_y - up_y * dir_x;
    length = sqrt( side_x*side_x + side_y*side_y + side_z*side_z );
    if ( length < 0.0001 ) {
    side_x = 1.0; side_y = 0.0; side_z = 0.0;  length = 1.0;
    }
    side_x /= length;  side_y /= length;  side_z /= length;
    up_x = dir_y * side_z - dir_z * side_y;
    up_y = dir_z * side_x - dir_x * side_z;
    up_z = dir_x * side_y - dir_y * side_x;
    GLdouble  m[16] = { side_x, side_y, side_z, 0.0,
    up_x,   up_y,   up_z,   0.0,
    dir_x,  dir_y,  dir_z,  0.0,
    0.0,    0.0,    0.0,    1.0 };
    glMultMatrixd( m );
    GLdouble radius= 0.2; 
    GLdouble slices = 8.0;
    GLdouble stack = 3.0;  
    gluCylinder( quad_obj, radius, radius, bone_length, slices, stack );  glPopMatrix();
    }
      

  2.   

    换句话说,如何通过一个方向向量,得到一个相对于原坐标系(x: right, y: up, z: back)的旋转矩阵?可以通过逆矩阵
      

  3.   

    顺便说一下,还有另外一种方法,感兴趣的童鞋可以参见:
    http://stackoverflow.com/questions/286274/direct3d-geometry-rotation-matrix-from-two-vectors
    我现在就是按这种算法做的