首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何绘制移动的激光束?

如何绘制移动的激光束?
EN

Stack Overflow用户
提问于 2010-08-03 08:14:35
回答 3查看 1.8K关注 0票数 2

我想画一束可以在盒子周围弹跳的激光束。基本上,激光束的长度是可变的,当它从表面反弹时,它会以碰撞的角度反射。

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

很抱歉,我的解释很糟糕。

EN

回答 3

Stack Overflow用户

发布于 2010-08-03 08:45:54

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

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

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

<

  • >F29

基本上,以v速度运动的光束以θ角撞击墙壁。碰撞会发生多长时间?(从碰撞发生到光束完全穿过入射点需要多长时间?)

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

v.x = cos(theta) *v

v.y = sin(theta) *v

l.x = cos(theta) *l

l= sin(theta) *l

如果梁可以反射的墙本身是成角度的,则必须使用墙的角度作为参照系(使用两个角度之间的差异)来投影到它们上。

现在,光束从左侧撞击并忽略右侧所需的时间由下式给出:

D= l.x/v.x

假设入射开始于时间t,当前时间为T,则入射点左右两边绘制的光束比例为,

R= (T - t)/d

左=l*r

right =l* (1 - r)

这个例子已经简化,只显示了当光束从左到右撞击时,如何计算它的位置。我认为将这些原则应用于从顶部或底部撞击垂直屏障的梁应该是一个相当简单的过程。另外,考虑这样一种情况,即光束的头部撞上第二个障碍物,同时仍与第一个障碍物发生碰撞。

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

票数 2
EN

Stack Overflow用户

发布于 2010-08-06 12:11:23

听起来你并不是真的在谈论激光束,而是一把枪发射了一个明亮的抛射体,反射出表面,然后你想看着它在盒子周围反弹。(好吧,至少这就是我要回答的问题!)有更复杂、高效、通用、准确等方法,但问题有一个简单的解决方案,特别是当盒子有垂直的墙时(即普通盒子):

使用枪的发射方向,找到三个速度分量(vx,vy,vz),在你绘制子弹的每个时间步,更新它的位置x+=dtvx,y+=dt_vy,z+=dt*vz,并继续这样做,直到你撞到墙上。如果你撞到了墙,只需反转速度矢量的适当分量,例如,如果你撞到了与y-z平面平行的墙,则将vx带到-vx。然后继续往前走,直到你撞到另一面墙,然后再次反转适当的组件……

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

代码语言:javascript
复制
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()

就像我说的,效率不是很高,但是很简单。

票数 1
EN

Stack Overflow用户

发布于 2010-08-03 08:21:01

我想你会想要调查OpenGL的。iPhone上的OpenGL上有一个经常链接的资源:OpenGL ES from the Ground Up

由于OpenGL在许多平台上使用,因此您可以使用各种各样的资源。在谷歌上快速搜索"bouncing laser opengl“会得到一些令人振奋的结果。如果你在搜索中加入“游戏”,你可能会找到更像你给出的例子的东西(实际上看到的是激光束的末端在四处弹跳)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3392743

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档