请问用射线检测实现的小球瞄准线怎么做


这个是我用笨方法实现的,会闪
之前看过白玉无冰老师的文章但是自己一直没法实现出来《反复横跳的瞄准线!…》

想问下这个在3.x和怎么用射线检测实现呀(有2.x的也ok

射线测试

Box2D 物理模块(Builtin 模块没有)提供了射线检测来检测给定的线段穿过哪些碰撞体,我们还可以获取到碰撞体在线段穿过碰撞体的那个点的法线向量和其他一些有用的信息。

const results = PhysicsSystem2D.instance.raycast(p1, p2, type, mask);

for (const i = 0; i < results.length; i++) {
    const result = results[i];
    const collider = result.collider;
    const point = result.point;
    const normal = result.normal;
    const fraction = result.fraction;
}

求教,求教!!!有没有大佬睡醒了

不懂你的会闪是什么意思,我觉得就根据向量然后反射来做就可以呀

实例化小球


    InitBulletNumArr(s: number, node: Node) {
        for (let i = 0; i < s; i++) {
            let p = instantiate(node)
            p.setParent(this.node)
            p.active = false
            this.LineBulletArr.push(p)
        }
        this.LineBullet.active = false
    }

update函数中的CanDraw代表可以画线


    update(deltaTime: number) {
        
        if (this.Pao1.getComponent(Pao1).isScFlag == false && this.BulletArr.getComponent(BulletArr).count == 0) {
            this.CanDraw = true
        }
        else if (this.Pao1.getComponent(Pao1).isScFlag == true && this.BulletArr.getComponent(BulletArr).count > 0) {
            this.CanDraw = false
        }

        if (this.CanDraw) {
            let angle = this.node.eulerAngles.z * 2 / 360 * Math.PI;
            //计算基于Y轴的方向向量
            let dir = v2(Math.cos(angle), Math.sin(angle));
            //方向向量进行单位化
            dir.normalize()

            for (let i = 0; i < this.BulletNum; i++) {
                if (this.LineBulletArr[i].getWorldPosition().x < -18) {
                    let t = this.LineBulletArr[i].getWorldPosition
                    this.LineBulletArr[i].setPosition(i * 50 * dir.y, i * 50 * dir.x, 0)
                    this.LineBulletArr[i].setWorldPosition(-(this.LineBulletArr[i].getWorldPosition().x + 20), this.LineBulletArr[i].getWorldPosition().y, 0)
                    if (this.LineBulletArr[i].active == false) {
                        this.LineBulletArr[i].active = true
                    }
                }
                else if (this.LineBulletArr[i].getWorldPosition().x > 700) {
                    this.LineBulletArr[i].setPosition(i * 50 * dir.y, i * 50 * dir.x, 0)
                    this.LineBulletArr[i].setWorldPosition(1424 - this.LineBulletArr[i].getWorldPosition().x, this.LineBulletArr[i].getWorldPosition().y, 0)
                    if (this.LineBulletArr[i].active == false) {
                        this.LineBulletArr[i].active = true
                    }
                }
                else {
                    this.LineBulletArr[i].setPosition(i * 50 * dir.y, i * 50 * dir.x, 0)
                    if (this.LineBulletArr[i].active == false) {
                        this.LineBulletArr[i].active = true
                    }
                }

            }
        }
        if (!this.CanDraw) {
            for (let i = 0; i < this.BulletNum; i++) {
                if (this.LineBulletArr[i].active != false) {
                    this.LineBulletArr[i].active = false
                }
            }
        }
    }

就是折射出来的小球会拼命的闪 :cry:当时刚接触cocos绞尽脑汁就将就着这样


连GPT都无语了

你画出的线是还会自己往前移动的那种么

不会,每条线的位置相对准确。我用一个名为Line节点作为小球的父节点,放在Pao1的子节点下,按住Paol1挪动方向,在Line节点的脚本上update()画线 :rofl:

我感觉应该不用再update里面画吧,你触摸开始时候以及移动时候调下方法刷新不就可以。

对,这个方法我要舍弃了。移动时让它复现,但是我不知道怎么用射线检测

不用射线检测,单纯向量就可以算。

4赞

写的不错,他是我的了~

感谢大佬,这个函数的转换逻辑是怎么实现的

  let relativeResults = new ComonSceneFunc().AimLineDest(relativeVec,
            1000, new Vec2(dest.x, dest.y));

还有genneraterAimPoint()传进来的两个参数代表啥 :tulip: :tulip:

genneraterAimPoint(aimVec: Vec2, results: (Vec3 | Vec2)[])

传的是射线检测需要的数据, 第二个问题aimvec就是瞄准向量(手指到球的向量), results是刚触摸会进行一次射线检测,返回的终点数据(有法线, 和终点坐标)

4赞

好嘞,多谢多谢

:upside_down_face:我我第一次触摸的results传不进去

小狐狸,你的方法也分享一起给我学学呀 :heart:单纯向量不闪怎么实现

我没现成的代码,我得写demo才行,看看周末吧,急着要么