java在OpenGL中围绕点旋转直线
我试图绕一个不是(0,0)的点旋转一条线
对于这个程序,我尽量不使用glRotatef()
,而是尝试使用三角学。然而,线路的长度总是会变化的
有什么建议吗
这是我的代码:
public class World implements GLEventListener, KeyListener
{
double xOne = 0.1;
double yOne = 0.1;
double xTwo = 0;
double yTwo = 0.01;
double i = 220.987;
public World()
{
}
public void init(GLAutoDrawable gld)
{
Animator theAnimator = new Animator(gld);
theAnimator.start();
}
public void display(GLAutoDrawable gld)
{
GL gl = gld.getGL();
gl.glEnable(gl.GL_BLEND);
gl.glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT);
gl.glBegin(gl.GL_LINES);
gl.glColor3d(1,0,0);
gl.glVertex2d(xOne ,yOne);
gl.glColor3d(0,0,1);
gl.glVertex2d(xTwo, yTwo);
gl.glEnd();
gl.glFlush();
//UPDATE
}
public void reshape(GLAutoDrawable gLAutoDrawable, int _int, int _int2, int _int3, int _int4)
{
}
public void displayChanged(GLAutoDrawable gLAutoDrawable, boolean _boolean, boolean _boolean2)
{
}
public void keyTyped(KeyEvent ke)
{
}
public void keyPressed(KeyEvent ke)
{
if(ke.getKeyCode() == KeyEvent.VK_SPACE)
{
xTwo = (Math.cos(Math.toRadians(i))+xOne);
yTwo = (Math.sin(Math.toRadians(i))+yOne);
i++;
}
}
public void keyReleased(KeyEvent ke)
{
}
}
顺便说一下,(xOne, yOne)
是驻点
# 1 楼答案
通常,你可以通过转换为(0,0),围绕(0,0)旋转,然后再转换回来。因此,这是一个三步过程:
就你而言,我认为你的代码已经基本正确了。你缺少的是直线长度的乘法。使用距离公式计算(xOne,yOne)和(xTwo,yTwo)之间的距离,并将该距离乘以正弦和余弦值,然后再将xOne和yOne相加
# 2 楼答案
理解转换是在OpenGL中有效工作的必要条件
转换涉及一个系统如何以两种不同的方式表示。所以一个位于(3,4)的点可以转化为一个位于(0,0)的点,在一个“交替宇宙”中,原点位于(3,4)
围绕一个点旋转很容易,基本上就是这个公式
同样,这种情况也很容易逆转
旋转变换看起来像
这将为围绕原点旋转弧度的点提供一个新的x'和y'
所以,要在OpenGL中旋转,首先要将所有点变换为一个新原点,即旋转原点。然后围绕原点旋转。然后将所有点从新原点转换回旧原点
就像詹姆斯在上面说的,我只是用了更多的词