我有一个相当复杂的问题。本质上,我有一个跟踪玩家位置的对象,使用 LOS 算法始终飞向玩家当前位置。
然而,我遇到了一个问题,因为我试图让物体朝玩家的方向发射子弹。该对象使用纯矢量数学向玩家移动,但考虑到我的函数如何运作,子弹需要使用四元数。
那么,如果一个对象向玩家移动,我如何进行四元数旋转,子弹函数可以使用它来创建子弹也向玩家移动,其源是对象?
我绘制跟随玩家的对象的功能:
private void drawEnemy(GameTime gameTime)
{
angle += 0.1f;
velocity = Vector3.Normalize(xwingPosition - enemyPos) * 0.02f;
enemyPos = enemyPos + velocity;
enemyWorldMatrix = Matrix.CreateRotationY(angle) * Matrix.CreateTranslation(enemyPos);
DrawObject(enemy, enemyWorldMatrix, viewMatrix, projectionMatrix);
//enemyRotation = GetRotation(xwingPosition, enemyPos);
//Quaternion additionalRot = Quaternion.CreateFromAxisAngle(new Vector3(0, -1, 0), -0.1f) * Quaternion.CreateFromAxisAngle(new Vector3(0, 1, 0), -0.1f);
//enemyRotation *= additionalRot;
double currentTime = gameTime.TotalGameTime.TotalMilliseconds;
if (currentTime - enemyLastBulletTime > 1000)
{
EnemyBullet newBullet = new EnemyBullet();
newBullet.position = new Vector3(enemyPos.X + 0.2f, 71, enemyPos.Z + 0.2f);
newBullet.t = 0.01f;
newBullet.proportion = newBullet.t / 120;
newBullet.playerPosition = xwingPosition;
newBullet.enemyPosition = enemyPos;
newBullet.currentAccel = 0.025f;
enemyBulletList.Add(newBullet);
enemyLastBulletTime = currentTime;
}
}
如您所见,它使用矢量数学来跟踪并朝玩家移动。
如您所见,我正在尝试创建项目符号。子弹使用我希望我正确创建的四元数旋转。
从我编写的第一个函数创建子弹后,我的函数会更新子弹的位置。
private void UpdateEnemyBulletPositions()
{
for (int i = 0; i < enemyBulletList.Count; i++)
{
EnemyBullet currentBullet = enemyBulletList[i];
currentBullet.t += 0.01f;
currentBullet.position = enemyPos + (Vector3.Normalize(currentBullet.playerPosition - currentBullet.enemyPosition) * currentBullet.proportion);
MoveForward(ref currentBullet.position, currentBullet.rotation, 0.04f + (currentBullet.currentAccel));
enemyBulletList[i] = currentBullet;
BoundingSphere bulletSphere = new BoundingSphere(currentBullet.position, 0.05f);
CollisionType colType = CheckCollision(bulletSphere);
if (colType != CollisionType.None)
{
enemyBulletList.RemoveAt(i);
i--;
if (colType == CollisionType.Target)
gameSpeed *= 1.05f;
}
}
}
xwingPosition是玩家当前的位置。
enemyPos是跟随玩家的物体的当前位置
这个问题显示在我刚刚准备的这个 youtube 剪辑中......
http://www.youtube.com/watch?v=PnkCVKdfN9Y
我认为问题在于将 t 设置为总经过的毫秒数,而不是从 0 开始的计数器。问题是,我不知道每次制作子弹时如何从 0 开始计数器。