Libgdx 未通过UV坐标应用纹理

Libgdx 未通过UV坐标应用纹理,libgdx,Libgdx,我正在将一个简单的three.js场景转换为libgdx。一切加载和运行正常,但似乎我的对象的UV纹理坐标没有正确应用?我将.obj/.mtl用于模型和纹理。我知道在教程中提到,在制作中应该使用.g3db格式而不是.obj格式,我计划这样做,但我仍然很好奇为什么我的.objs没有正确映射纹理?以前有人见过这种情况吗?我是不是错过了什么 LIBGDX THREEJS package com.freedom.三十; 导入com.badlogic.gdx.ApplicationListener;

我正在将一个简单的three.js场景转换为libgdx。一切加载和运行正常,但似乎我的对象的UV纹理坐标没有正确应用?我将.obj/.mtl用于模型和纹理。我知道在教程中提到,在制作中应该使用.g3db格式而不是.obj格式,我计划这样做,但我仍然很好奇为什么我的.objs没有正确映射纹理?以前有人见过这种情况吗?我是不是错过了什么

LIBGDX

THREEJS

package com.freedom.三十;
导入com.badlogic.gdx.ApplicationListener;
导入com.badlogic.gdx.gdx;
导入com.badlogic.gdx.assets.AssetManager;
导入com.badlogic.gdx.graphics.Color;
导入com.badlogic.gdx.graphics.GL20;
导入com.badlogic.gdx.graphics.PerspectiveCamera;
导入com.badlogic.gdx.graphics.VertexAttributes.Usage;
导入com.badlogic.gdx.graphics.g3d.Environment;
导入com.badlogic.gdx.graphics.g3d.Model;
导入com.badlogic.gdx.graphics.g3d.ModelBatch;
导入com.badlogic.gdx.graphics.g3d.ModelInstance;
导入com.badlogic.gdx.graphics.g3d.attributes.ColorAttribute;
导入com.badlogic.gdx.graphics.g3d.environment.DirectionalLight;
导入com.badlogic.gdx.graphics.g3d.Material;
导入com.badlogic.gdx.graphics.g3d.utils.CameraInputController;
导入com.badlogic.gdx.graphics.g3d.utils.ModelBuilder;
导入com.badlogic.gdx.utils.Array;
导入com.badlogic.gdx.graphics.FPSLogger;
公共类FreeDomThreen实现ApplicationListener{
公众透视摄像机;
公共摄像机控制器;
公共模型批处理模型批处理;
公共资产管理者资产;
公共数组allModelInstances=新数组();
公共环境;
公共布尔加载;
公共阵列玩家=新阵列();
公共模型实例播放器;
公共事务委员会;
公共模型实例skybox;
public FPSLogger theLogger=新的FPSLogger();
@凌驾
公共void create(){
modelBatch=新modelBatch();
环境=新环境();
set(新的ColorAttribute(ColorAttribute.AmbientLight,0.4f,0.4f,0.4f,1f));
添加(新的DirectionalLight().set(0.8f,0.8f,0.8f,-1f,-0.8f,-0.2f));
cam=新透视照相机(45,Gdx.graphics.getWidth(),Gdx.graphics.getHeight());
凸轮位置设定(-4f,4f,4f);
凸轮注视(5f,0f,-5f);
cam.near=1f;
cam.far=1000f;
cam.update();
camController=新的CameraInputController(cam);
Gdx.input.setInputProcessor(camController);
资产=新资产管理器();
负载(“test_character.obj”,Model.class);
负荷(“仪表网格.obj”,型号.class);
assets.load(“skybox1.obj”,Model.class);
加载=真;
}
私有void doneLoading(){
skybox=newModelInstance(assets.get(“skybox1.obj”,Model.class));
board=新的ModelInstance(assets.get(“meter_grid.obj”,Model.class));
添加(线路板);
player=新模型实例(assets.get(“test_character.obj”,Model.class));
添加(播放器);
players.add(player);
加载=假;
}
@凌驾
公共无效呈现(){
if(加载&assets.update()){
doneLoading();
}
camController.update();
glViewport(0,0,Gdx.graphics.getWidth(),Gdx.graphics.getHeight());
Gdx.gl.glClear(GL20.gl_颜色_缓冲_位| GL20.gl_深度_缓冲_位);
modelBatch.begin(cam);
render(所有模型实例,环境);
如果(skybox!=null){
modelBatch.render(skybox);
}
modelBatch.end();
log.log();
}
@凌驾
公共空间处置(){
modelBatch.dispose();
allModelInstances.clear();
资产。处置();
}
@凌驾
公共空心调整大小(整型宽度、整型高度){
}
@凌驾
公共空间暂停(){
}
@凌驾
公众简历(){
}
}

您需要翻转坐标,请参见:@Xoppa这确实是解决方案。投票后发表评论。如果你想把这变成一个答案,我会接受的。非常感谢:)您需要翻转坐标,请参见:@Xoppa这确实是解决方案。投票后发表评论。如果你想把这变成一个答案,我会接受的。非常感谢:)
package com.freedom.thirty;

import com.badlogic.gdx.ApplicationListener;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.assets.AssetManager;
import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.graphics.GL20;
import com.badlogic.gdx.graphics.PerspectiveCamera;
import com.badlogic.gdx.graphics.VertexAttributes.Usage;
import com.badlogic.gdx.graphics.g3d.Environment;
import com.badlogic.gdx.graphics.g3d.Model;
import com.badlogic.gdx.graphics.g3d.ModelBatch;
import com.badlogic.gdx.graphics.g3d.ModelInstance;
import com.badlogic.gdx.graphics.g3d.attributes.ColorAttribute;
import com.badlogic.gdx.graphics.g3d.environment.DirectionalLight;
import com.badlogic.gdx.graphics.g3d.Material;
import com.badlogic.gdx.graphics.g3d.utils.CameraInputController;
import com.badlogic.gdx.graphics.g3d.utils.ModelBuilder;
import com.badlogic.gdx.utils.Array;
import com.badlogic.gdx.graphics.FPSLogger;


public class FreedomThirty implements ApplicationListener {

    public PerspectiveCamera cam;
    public CameraInputController camController;
    public ModelBatch modelBatch;
    public AssetManager assets;
    public Array<ModelInstance> allModelInstances = new Array<ModelInstance>();
    public Environment environment;
    public boolean loading;

    public Array<ModelInstance> players = new Array<ModelInstance>();
    public ModelInstance player;


    public ModelInstance board;
    public ModelInstance skybox;

    public FPSLogger theLogger = new FPSLogger();

    @Override
    public void create() {
        modelBatch = new ModelBatch();
        environment = new Environment();
        environment.set(new ColorAttribute(ColorAttribute.AmbientLight, 0.4f, 0.4f, 0.4f, 1f));
        environment.add(new DirectionalLight().set(0.8f, 0.8f, 0.8f, -1f, -0.8f, -0.2f));

        cam = new PerspectiveCamera(45, Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
        cam.position.set(-4f, 4f, 4f);
        cam.lookAt(5f, 0f, -5f);
        cam.near = 1f;
        cam.far = 1000f;
        cam.update();

        camController = new CameraInputController(cam);
        Gdx.input.setInputProcessor(camController);

        assets = new AssetManager();
        assets.load("test_character.obj", Model.class);
        assets.load("meter_grid.obj", Model.class);
        assets.load("skybox1.obj", Model.class);
        loading = true;        

    }

    private void doneLoading(){

        skybox = new ModelInstance(assets.get("skybox1.obj", Model.class));

        board = new ModelInstance(assets.get("meter_grid.obj", Model.class));
        allModelInstances.add(board);

        player = new ModelInstance(assets.get("test_character.obj", Model.class));
        allModelInstances.add(player);
        players.add(player);


        loading = false;        

    }

    @Override
    public void render() {

        if(loading && assets.update()){
            doneLoading();
        }

        camController.update();

        Gdx.gl.glViewport(0, 0, Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
        Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT | GL20.GL_DEPTH_BUFFER_BIT);

        modelBatch.begin(cam);
        modelBatch.render(allModelInstances, environment);
        if(skybox != null){
            modelBatch.render(skybox);
        }
        modelBatch.end();

        theLogger.log();

    }

    @Override
    public void dispose() {

        modelBatch.dispose();
        allModelInstances.clear();
        assets.dispose();

    }

    @Override
    public void resize(int width, int height) {
    }

    @Override
    public void pause() {
    }

    @Override
    public void resume() {
    }

}