Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 边界框在Libgdx中计算位置不正确_Java_Libgdx - Fatal编程技术网

Java 边界框在Libgdx中计算位置不正确

Java 边界框在Libgdx中计算位置不正确,java,libgdx,Java,Libgdx,我正在尝试制作一个我创建的模型,在libgdx中检测与一个框的碰撞-我有5个框,并使用边界框来检查碰撞 这是具有碰撞的三维场景: 无碰撞 在这一点上,我期望得到一个碰撞,但是没有检测到任何东西,因为边界框是完全不同的。这是假设发生碰撞时每个框和挂钩的边界框中心(图1): 这是我创建箱子和起重机模型的代码: public class Crane { public ModelInstance modelInstance; public Node cuerd

我正在尝试制作一个我创建的模型,在libgdx中检测与一个框的碰撞-我有5个框,并使用边界框来检查碰撞

这是具有碰撞的三维场景:

无碰撞

在这一点上,我期望得到一个碰撞,但是没有检测到任何东西,因为边界框是完全不同的。这是假设发生碰撞时每个框和挂钩的边界框中心(图1):

这是我创建箱子和起重机模型的代码:

    public class Crane {
        public ModelInstance modelInstance;
        public Node cuerda,polea,brazo;
        ArrayList<ModelInstance> boxes;
        int pulleyMoves,maxPulleyMoves,minPulleyMoves;
        int armMoves,maxArmMoves,minArmMoves;
        int ropeMoves,maxRopeMoves,minRopeMoves;
    public Crane(){
        ModelBuilder modelBuilder = new ModelBuilder();
        UBJsonReader jsonReader = new UBJsonReader();
        G3dModelLoader modelLoader = new G3dModelLoader(jsonReader);
        Model model;
        model = modelLoader.loadModel(Gdx.files.getFileHandle("crane.g3db", Files.FileType.Internal));
        modelInstance = new ModelInstance(model);
        modelInstance.transform.scale(0.05f, 0.05f, 0.05f);
        modelInstance.transform.translate(0, 0, 500);
        modelInstance.calculateTransforms();
        cuerda = modelInstance.getNode("cuerda_mover");
        polea = modelInstance.getNode("polea");
        brazo = modelInstance.getNode("Cube.109");
        model = modelBuilder.createBox(20, 20, 20, new Material(ColorAttribute.createDiffuse(Color.BLUE)),
                VertexAttributes.Usage.Position | VertexAttributes.Usage.Normal);
        boxes= new ArrayList<ModelInstance>();
        boxes.add(new ModelInstance(model));
        boxes.add(new ModelInstance(model));
        boxes.add(new ModelInstance(model));
        boxes.add(new ModelInstance(model));
        boxes.add(new ModelInstance(model));
        boxes.get(0).transform.translate(0, 15, -10);
        boxes.get(1).transform.translate(0, 15, -40);
        boxes.get(2).transform.translate(0, 15, -70);
        boxes.get(3).transform.translate(0, 15, -100);
        boxes.get(4).transform.translate(0, 15, -130);

        for(ModelInstance box: boxes){
            box.calculateTransforms();

        }



    }
public int intersects(){

    Node hook = this.modelInstance.getNode("gancho");

    BoundingBox bbCrane = hook.calculateBoundingBox(new BoundingBox());


    System.out.println("BB HOOK: "+bbCrane.getCenter(new Vector3(0, 0, 0)).toString());
    int i =0;
    for(ModelInstance box: this.boxes){

        BoundingBox bbBox = box.calculateBoundingBox(new BoundingBox());
        bbBox .mul(box.transform);
        System.out.println("BB BOX "+i+": "+bbBox.getCenter(new Vector3(0, 0, 0)).toString());
        if(bbCrane.intersects(bbBox )){
            System.out.println("------------------------------------------ COLISION !!!! -------------------------------------------");
            return i;
        }
        i++;
    }
    return -1;


}

    }
公共级起重机{
公共模型实例模型实例;
公共节点cuerda、polea、brazo;
阵列列表框;
int-purreymoves,maxprullymoves,minpurreymoves;
int armMoves、maxArmMoves、minArmMoves;
int-ropeMoves、maxRopeMoves、minRopeMoves;
公共起重机(){
ModelBuilder ModelBuilder=新的ModelBuilder();
UBJsonReader jsonReader=新的UBJsonReader();
G3dModelLoader modelLoader=新G3dModelLoader(jsonReader);
模型;
model=modelLoader.loadModel(Gdx.files.getFileHandle(“crane.g3db”,files.FileType.Internal));
modelInstance=新的modelInstance(模型);
modelInstance.transform.scale(0.05f,0.05f,0.05f);
modelInstance.transform.translate(0,0500);
modelInstance.calculateTransforms();
cuerda=modelInstance.getNode(“cuerda_mover”);
polea=modelInstance.getNode(“polea”);
brazo=modelInstance.getNode(“Cube.109”);
model=modelBuilder.createBox(20,20,20,新材质(ColorAttribute.createDiffuse(Color.BLUE)),
VertexAttributes.Usage.Position | VertexAttributes.Usage.Normal);
Box=新的ArrayList();
添加(新模型实例(模型));
添加(新模型实例(模型));
添加(新模型实例(模型));
添加(新模型实例(模型));
添加(新模型实例(模型));
box.get(0)、transform.translate(0,15,-10);
box.get(1)、transform.translate(0,15,-40);
box.get(2)、transform.translate(0,15,-70);
box.get(3)、transform.translate(0,15,-100);
box.get(4)、transform.translate(0,15,-130);
对于(模型实例框:框){
box.calculateTransforms();
}
}
公共整数相交(){
Node hook=this.modelInstance.getNode(“gancho”);
BoundingBox bbCrane=hook.calculateBoundingBox(新的BoundingBox());
System.out.println(“BB HOOK:+bbCrane.getCenter(新向量3(0,0,0)).toString());
int i=0;
例如(ModelInstance框:this.box){
BoundingBox bbBox=box.calculateBoundingBox(新的BoundingBox());
bbBox.mul(box.transform);
System.out.println(“bbBox”+i+:“+bbBox.getCenter(新向量3(0,0,0)).toString());
if(BB起重机交叉点(bbBox)){
System.out.println(“---------------------------------------COLISION!!!!----------------------------------------------------”;
返回i;
}
i++;
}
返回-1;
}
}
我不明白为什么钩子的包围盒坐标比盒子大。有人能帮我解决这个问题吗

编辑:


如果有用的话,我上下移动绳子的方法是在z轴上按因子缩放钩子的父节点(即绳子)。

那么你的问题是为什么钩子模型的边界比你预期的大?然后考虑这些界限的价值和你的期望。除此之外,您正在创建大量垃圾,您可能需要重新考虑您的方法。看一看:(你想阅读之前和之后的教程)这些值包含在场景图片的后面。我关心的是z轴,因为它的值为-2000+,而离起重机较远的箱子的z值为-130,这是正确的。我希望得到与我创建的框的边界框相似的值,这些框不是边界,只是中心。您也没有同时考虑模型实例和节点的变换(缩放、平移和旋转)。因此CreateBundingBox方法没有考虑节点或其父节点的所有变换?另外,我将尽快为问题添加边界。非常感谢每个边界框的边界和添加到问题中的钩子。
    public class Crane {
        public ModelInstance modelInstance;
        public Node cuerda,polea,brazo;
        ArrayList<ModelInstance> boxes;
        int pulleyMoves,maxPulleyMoves,minPulleyMoves;
        int armMoves,maxArmMoves,minArmMoves;
        int ropeMoves,maxRopeMoves,minRopeMoves;
    public Crane(){
        ModelBuilder modelBuilder = new ModelBuilder();
        UBJsonReader jsonReader = new UBJsonReader();
        G3dModelLoader modelLoader = new G3dModelLoader(jsonReader);
        Model model;
        model = modelLoader.loadModel(Gdx.files.getFileHandle("crane.g3db", Files.FileType.Internal));
        modelInstance = new ModelInstance(model);
        modelInstance.transform.scale(0.05f, 0.05f, 0.05f);
        modelInstance.transform.translate(0, 0, 500);
        modelInstance.calculateTransforms();
        cuerda = modelInstance.getNode("cuerda_mover");
        polea = modelInstance.getNode("polea");
        brazo = modelInstance.getNode("Cube.109");
        model = modelBuilder.createBox(20, 20, 20, new Material(ColorAttribute.createDiffuse(Color.BLUE)),
                VertexAttributes.Usage.Position | VertexAttributes.Usage.Normal);
        boxes= new ArrayList<ModelInstance>();
        boxes.add(new ModelInstance(model));
        boxes.add(new ModelInstance(model));
        boxes.add(new ModelInstance(model));
        boxes.add(new ModelInstance(model));
        boxes.add(new ModelInstance(model));
        boxes.get(0).transform.translate(0, 15, -10);
        boxes.get(1).transform.translate(0, 15, -40);
        boxes.get(2).transform.translate(0, 15, -70);
        boxes.get(3).transform.translate(0, 15, -100);
        boxes.get(4).transform.translate(0, 15, -130);

        for(ModelInstance box: boxes){
            box.calculateTransforms();

        }



    }
public int intersects(){

    Node hook = this.modelInstance.getNode("gancho");

    BoundingBox bbCrane = hook.calculateBoundingBox(new BoundingBox());


    System.out.println("BB HOOK: "+bbCrane.getCenter(new Vector3(0, 0, 0)).toString());
    int i =0;
    for(ModelInstance box: this.boxes){

        BoundingBox bbBox = box.calculateBoundingBox(new BoundingBox());
        bbBox .mul(box.transform);
        System.out.println("BB BOX "+i+": "+bbBox.getCenter(new Vector3(0, 0, 0)).toString());
        if(bbCrane.intersects(bbBox )){
            System.out.println("------------------------------------------ COLISION !!!! -------------------------------------------");
            return i;
        }
        i++;
    }
    return -1;


}

    }