设为首页收藏本站喵玉殿官方微博

 找回密码
 少女注册中
搜索
查看: 10588|回复: 16

[编程算法] Dx中曲线激光的实现方法

  [复制链接]
发表于 2014-12-9 22:06:56 | 显示全部楼层 |阅读模式
暑假的时候想做曲线激光,当时搜了半天找不到适合的解决办法来着,
看到了一些讨论的思路,例如求角平分线什么的,计算量感觉有点大,不太好
于是一时脑洞想到可以利用速度来确定运动方向!(咦这真的不是废话嘛?)

首先是类声明,我的思路是实际物体的属性/物体间的联系为一类,
绘制用到的方法(比如精灵,动画)为另一类,实际物体作为宿主。。
这里是曲线形精灵类~
code1.jpg

核心的实现方法在这里~注释我想应该够的吧~
code2.jpg

初始化的时候记得把index调好,纹理位置什么的设置对~
code3.jpg

最后这里是新人~平时在学校找不到什么人讨论游戏制作,还请各位多多指教~!

评分

参与人数 1积分 +4 喵玉币 +10 萌度 +30 收起 理由
drzzm32 + 4 + 10 + 30 加油学习讨论吧~

查看全部评分

发表于 2014-12-9 23:13:56 | 显示全部楼层
我认为曲线激光的本质和《妖精大战争》中魔理沙的“彗星”符卡是一样的:

先定义一个能在任意形状上判定的方法,
然后定义一个头,就像lz做的那样
然后用头的移动轨道生成一个尾巴区域(unity里叫trailer)
最后把判定方法加到这个尾巴区域上

这样就是真正无缝的啦
回复

使用道具 举报

 楼主| 发表于 2014-12-9 23:33:38 | 显示全部楼层
本帖最后由 Darksword 于 2014-12-9 23:36 编辑
krh 发表于 2014-12-9 23:13
我认为曲线激光的本质和《妖精大战争》中魔理沙的“彗星”符卡是一样的:

先定义一个能在任意形状上判定 ...

感谢回复和分享经验~!
不了解unity,只是在用c++和dx。。不过你的确提供了一个我不敢想的思路呢!
“首先找到任意形状判定的方法”,这点直接把我吓到了。
应该是要拟合吧,用圆或矩形,或者直接去学习借鉴3D碰撞的方法?无论哪种效率都不敢想诶诶
trail的原理不太清楚,是不是类似粒子效果呢?
之前试过用离散的粒子/精灵,也许是我设计不到位,感觉不连续不好看噗。。
我这个试过,90度以上的直接拐弯会有失真(是直着拐,没有缓冲),
其他的看起来还好。。当然还需要修正。。。


诶诶刚刚查了一下,trail好酷炫的样子,又找到研究方向了!大感谢!
回复

使用道具 举报

发表于 2014-12-10 00:47:36 | 显示全部楼层
本帖最后由 krh 于 2014-12-9 12:57 编辑

trail 不是粒子,而是拖在后面的类似于痕迹的东西

关于那种方法……应该不是用拟合,至于到底用什么方法我也很好奇不过我认为dx里肯定有类似的方法的,用于判定自定义区域碰撞的方法
虽然我不确定按这条路找下去会不会有结果,但我似乎听说过一种判定“像素重叠”的方法

至于效率,肯定很低,不过神主的游戏中曲线激光也出现得不是很密集




回复

使用道具 举报

发表于 2014-12-10 13:30:42 | 显示全部楼层
llser.png
矢量(x,y)的垂直矢量是(-y,x)和(y,-x),不必旋转90度
trail.png
够密集应该也能像激光,至少我知道有些激光特效是密集粒子做的,只是第一个方法应该比较适合

点评

垂直的方法噗!!的确是个好的方法!嗯,第一张图看的很清楚,和我的做法差不多~!第二个,在玩HGE的粒子器的时候见识过,这样一分析更加理解算法了~谢谢!  发表于 2014-12-10 17:00
回复

使用道具 举报

发表于 2014-12-10 13:39:39 | 显示全部楼层
虽然不是太懂……
可以当成好多个短的直激光连在一起来做吧?

点评

理论上是这样的,但是要考虑连续问题(连接要连续,并且光滑),我们用顶点的方法的结果应该是一系列大小形状不一的三角形链,效果更好一些。不过分段激光可以在分段处补充特效,也是一种效果~  发表于 2014-12-10 17:03
回复

使用道具 举报

发表于 2014-12-10 13:45:20 | 显示全部楼层
为一个激光束定义一个mesh,或者vertex点集,同时直接将激光的贴图映射到这些区域上,然后在vertex shader里面进行滤镜变换(比如类似PS的扭曲滤镜等效果),甚至还可以穿到pixel shader里面进行其它变换(比如傅立叶快速像素变换等)。
回复

使用道具 举报

发表于 2014-12-10 14:06:34 来自手机 | 显示全部楼层
首先,考虑你的素材是什么。
一个长椭圆弹?好。

OpenGL的纹理绑定是可以拉伸的。DX应该也可以。。。

虽然对一个激光弹使用三角网格感觉不现实。。。也可以吧。。。

激光轨迹已知,那么就可以生成这么一个网格,以顶点数目控制激光长度。激光轨迹就是激光中心线。

对了我这全部都是参数方程即时计算坐标。

控制参数就可以控制长度了(或者说内部循环。

至于判定,可以对轨迹距离进行判定,或者对顶点进行判定。

实际最好就是去看看神主怎么处理的,看看擦弹计数器的变化。。。

点评

参数方程法。。不会是对每个顶点即时计算吧?我想我可以通过参数方程计算头结点0.0 哦不过的确长度不是特别容易控制。。厉害的思路!当初就是拿PIX分析了原作,才确定用网格的,碰撞测试的思路倒是第一次,谢谢!  发表于 2014-12-10 17:30
回复

使用道具 举报

发表于 2014-12-10 14:27:47 | 显示全部楼层
我自己写的时候也是这么想的。碰撞的话,或许可以每个节点做一个圆形碰撞
回复

使用道具 举报

 楼主| 发表于 2014-12-10 17:26:38 | 显示全部楼层
HHui 发表于 2014-12-10 13:45
为一个激光束定义一个mesh,或者vertex点集,同时直接将激光的贴图映射到这些区域上,然后在vertex shader里 ...

信号处理相关专业的Baka在这里看到FFT莫名感动QwQ 原来还能做滤波以外的事!
用shader来解决平滑扭曲的想法好棒!不过还请允许我再请教一下
像这样的shader,大概是经过特化,只适合某种情况吧?
那么如何组织这些不同的内容呢?是写到一个.fx里,用不同的technique名呢,还是每个都是独立的fx呢0.0
然后,既然shader和对象紧密相关了,那么是不是它的存在和纹理等价了,也就是一个可绘制对象对应一个effect这样,而不应该用“effect影响全局"这样的观念理解了0.0?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 少女注册中

本版积分规则

合作与事务联系|无图版|手机版|小黑屋|喵玉殿

GMT+8, 2025-10-31 14:03

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表