如何绘制移动的激光束?

时间:2010-08-03 00:14:35

标签: iphone objective-c graphics physics

我正在寻找可以在盒子周围反弹的激光束。基本上激光束的长度是可变的,当它从表面反弹时,它将以它碰撞的角度反射。

我自己可以处理碰撞事件(可能还没有尝试过),但是我对实际绘图如何在这里工作感到困惑。这不像我画一条直线,我需要有时复制线,所以有两条线相互成角度,但是当激光束停止时,游戏需要找出光束的末端是这样的在整个光束从表面反弹后,它可以停止绘制第一条线。

对于糟糕的解释感到抱歉。

3 个答案:

答案 0 :(得分:2)

我的数学和触发有点生疏,但这是我的尝试。

光束的正确位置和长度取决于四个变量,

  • v ,光束的速度,因为可能这不是真正的激光束,因此它的速度比 c 慢得多。为方便起见,我们可以将 v 存储为每单位时间从光束角度向前方向所覆盖的距离。
  • theta ,入射角,即光束撞击墙壁或障碍物的角度。
  • l ,梁的长度。
  • t ,事件发生的时间(让 T 为当前时间)。

基本上,以 v 速度行进的光束以 theta 的角度撞击墙壁。碰撞会持续多久? (从碰撞发生到光束完全穿过入射点的时间有多长?)

首先,因为光束相对于正交坐标集以一定角度行进,我们应该得到速度和长度的x和y分量。

v.x = cos( theta )* v
v.y = sin( theta )* v
l.x = cos( theta )* l
l.y = sin( theta )* l

如果光束可以反射的墙壁本身处于角度,则必须使用墙壁的角度作为参考框架投射到它们上(使用两个角度之间的差异)。

现在光束从左侧射出并从左侧射出所需的时间由下式给出:

d = l.x / v.x

假设事件在 t 时开始,当前时间为 T 。然后,在入射点的左侧和右侧绘制的光束的比例是,

r =( T - t )/ d
= l * r
正确 = l *(1 - r

此示例已经过简化,仅显示如果从左向右击打,可以计算光束位置。我认为将这些原理应用于从顶部或底部撞击垂直屏障的光束应该是一个相当简单的过程。另外,考虑到梁的头部在仍然与第一障碍物碰撞时撞击第二障碍物的情况。

在这种情况下,我们需要另一个变量代替 l 来表示不是光束的整个长度,而是可用于碰撞的光束段的长度(两者之间的欧几里德距离)事件地点)。

答案 1 :(得分:1)

听起来你并没有真正谈论激光束,而是关于枪射击从表面反射的明亮射弹,然后你想观察它在盒子周围反弹。 (好吧,至少那是我正在回答的问题!)有更复杂,高效,通用,准确等方法,但有一个简单的解决方案,特别是当盒子有垂直的墙壁(即一个普通的盒子) ):

使用射击枪的方向,找到三个速度分量,(vx,vy,vz),并在你绘制子弹时的每个时间步,更新它的位置x + = dt vx,y + = dt vy,z + = dt * vz,并继续这样做,直到你碰壁。 当您撞墙时,只需反转速度矢量的相应组件,例如如果你平行于y-z平面撞墙,请将vx带到-vx。然后继续前进,直到你撞到另一面墙,然后再反转相应的组件......

这是2D中的一个例子,这样我就可以显示一个情节,但3D与这个简单的方法完全相同。我用黑色显示完整路径,并用红色突出显示它的某些部分。此外,python中的示例,但唯一的导入关键行(x + = dt * vx,...)可能在翻译中不需要太多:

alt text http://i38.tinypic.com/k4238.png

from pylab import *
from collections import deque

dt = .01
x, y = .5, .5
vx, vy = .233, .61

data = deque(maxlen=100)
all_data = []

for i in range(6000):
    x += dt*vx
    y += dt*vy
    if x<0 or x>1:
        vx = -vx
    if y<0 or y>1:
        vy = -vy
    # store data and plot
    data.append((x, y))
    all_data.append((x, y))
    if i%400==0:
        plot(*zip(*data), color='r', linewidth=4)
plot(*zip(*all_data), color='k')

show()
像我说的那样,效率不高,但很容易。

答案 2 :(得分:0)

我想你会想要研究OpenGL。这是iPhone上OpenGL上经常链接的资源:OpenGL ES from the Ground Up

由于OpenGL在许多平台上使用,因此您可以使用各种资源。快速谷歌搜索“bouncing laser opengl”会产生一些有希望的结果。如果你将“游戏”投入到你的搜索中,你可能会发现更像你给出的例子(实际上看到激光束的两端弹跳)。