0

对此有任何帮助,我将 OpenGL 与 C# 一起使用。我不能使用任何其他库,除了:

using System;
using OpenGL;
using System.Windows.Forms;
using System.Collections.Generic;
using System.Drawing;

我似乎无法旋转我的图像,所以它面向移动的方式。

这在我的世界中被称为绘制方法:

foreach (Bug bug in m_Bugs) 
            {
                double radians = Math.Atan2(bug.getPos().X + bug.getVel().X, bug.getPos().Y + bug.getVel().Y);
                double angle = radians * (180 / Math.PI);

                GL.glRotated(angle, 0, 0, 1);
                bug.Draw(); 
            }

我的draw方法在这里的主线程中被调用:

form.RegisterDraw(myWorld.Draw);

我的 bug.draw 可以完美地显示和混合纹理。

我的 world.draw 方法中 foreach 循环中的代码将速度 (getVel) 和位置 (getPos) 作为二维向量返回。

任何帮助将不胜感激,干杯。

private void Load(uint[] array, int index, string filepath)
    {
        Bitmap image = new Bitmap(filepath);
        image.RotateFlip(RotateFlipType.RotateNoneFlipY);
        System.Drawing.Imaging.BitmapData bitmapdata;
        Rectangle rect = new Rectangle(0, 0, image.Width, image.Height);
        bitmapdata = image.LockBits(rect, System.Drawing.Imaging.ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format24bppRgb);

        /* Set the correct ID, then load the texture for that ID * from RAM onto the Graphics card */
        GL.glBindTexture(GL.GL_TEXTURE_2D, array[index]);
        GL.glTexImage2D(GL.GL_TEXTURE_2D, 0, (int)GL.GL_RGB8, image.Width, image.Height, 0, GL.GL_BGR_EXT, GL.GL_UNSIGNED_byte, bitmapdata.Scan0);
        GL.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MIN_FILTER, (int)GL.GL_LINEAR);
        GL.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MAG_FILTER, (int)GL.GL_LINEAR);

        /* This code releases the data that we loaded to RAM * but the texture is still on the Graphics Card */
        image.UnlockBits(bitmapdata);
        image.Dispose();
    }
4

2 回答 2

0

为什么是 Pos + Vel ?

看起来你只需要Pos。所以:

Math.Atan2( bug.getVel().X, bug.getVel().Y);
于 2011-12-07T17:50:32.593 回答
0

我已经在https://stackoverflow.com/a/7288931/524368中逐字引用了这个问题:


假设您的对象正在向 D 方向移动,那么您需要做的就是找到一个垂直于该方向的向量。如果你的运动只在一个平面上,你可以通过 D 与平面法线 N 的叉积来找到这个向量 E。

E = D × N

这将为您生成 3 个向量 D、E 和 N。归一化后,这些向量构成旋转坐标系的基础。您可以将它们放入 3×3 矩阵的列中

D_x E_x N_x
D_y E_y N_y
D_z E_z N_z

将此矩阵扩展为 4×4 同质矩阵

D_x E_x N_x 0
D_y E_y N_y 0
D_z E_z N_z 0
  0   0   0 1

您可以使用 glMultMatrix 将其传递给 OpenGL 以将其应用于矩阵堆栈。

于 2011-12-07T18:46:51.723 回答