c++ - 绕轴旋转坐标

标签 c++ math graphics rotation

我将一个形状表示为一组 3D 坐标,我试图围绕一个轴旋转整个对象(在本例中为 Z 轴,但一旦我得到,我想围绕所有三个轴旋转它工作)。

我已经编写了一些代码来使用旋转矩阵来执行此操作:


//Coord is a 3D vector of floats
//pos is a coordinate
//angles is a 3d vector, each component is the angle of rotation around the component axis
//in radians
Coord<float> Polymers::rotateByMatrix(Coord<float> pos, const Coord<float> &angles)
{
    float xrot = angles[0];
    float yrot = angles[1];
    float zrot = angles[2];

    //z axis rotation
    pos[0] = (cosf(zrot) * pos[0] - (sinf(zrot) * pos[1]));
    pos[1] = (sinf(zrot) * pos[0] + cosf(zrot) * pos[1]);   

    return pos;
}

下图显示了在尝试旋转之前我尝试旋转的对象(向下看 Z 轴),每个小球体表示我尝试旋转的坐标之一

alt text http://www.cs.nott.ac.uk/~jqs/notsquashed.png

通过以下代码对对象进行旋转:


//loop over each coordinate in the object
for (int k=start; k<finish; ++k)
{
    Coord<float> pos = mp[k-start];
    //move object away from origin to test rotation around origin
    pos += Coord<float>(5.0,5.0,5.0);

    pos = rotateByMatrix(pos, rots);

    //wrap particle position
    //these bits of code just wrap the coordinates around if the are
    //outside of the volume, and write the results to the positions
    //array and so shouldn't affect the rotation.
    for (int l=0; l<3; ++l)
    { 
        //wrap to ensure torroidal space
        if (pos[l] < origin[l]) pos[l] += dims[l];
        if (pos[l] >= (origin[l] + dims[l])) pos[l] -= dims[l];

        parts->m_hPos[k * 4 + l] = pos[l];
    }
}

问题是,当我以这种方式执行旋转时,将角度参数设置为 (0.0,0.0,1.0) 它可以工作(有点),但对象会变形,如下所示:

alt text http://www.cs.nott.ac.uk/~jqs/squashed.png

这不是我想要的。谁能告诉我我做错了什么以及如何绕轴旋转整个对象而不使其变形?

谢谢

点头

最佳答案

在 rotateByMatrix 中进行旋转的地方,您计算新的 pos[0],然后将其输入下一行以计算新的 pos[1]。所以你用来计算新 pos[1] 的 pos[0] 不是输入,而是输出。将结果存储在临时变量中并返回。

Coord<float> tmp;
tmp[0] = (cosf(zrot) * pos[0] - (sinf(zrot) * pos[1]));
tmp[1] = (sinf(zrot) * pos[0] + cosf(zrot) * pos[1]);   
return tmp;

此外,将 pos 作为常量引用传递给函数。

const Coord<float> &pos

此外,您应该计算一次 sin 和 cos 值,将它们存储在临时文件中并重复使用。

关于c++ - 绕轴旋转坐标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1694041/

相关文章:

java - 在Java中,如何防止图形Applet多次运行?

c++ - 将简体中文GB2312文本字符转换成UTF 8

c++ - 如何告诉编译器使用 C++ 2011 _in_code_ 而不是标志

c++ - 如何在不影响其他兄弟类的情况下向需要它的继承类添加成员函数,同时保持多态性?

java - 无法确定我的算法是否正确

java - Python scipy.optimize.leastsq 到 Java org.apache.commons.math3.fitting.leastsquares

c# - .net、mono 和 silverlight 的图形库

c++ - auto_ptr 和前向声明

math - float 学有问题吗?

r - 当只有一个绘图具有轴标签时,如何创建多个绘图,每个绘图具有相同的绘图区域大小?