立方体纹理问题

2023-12-09

我试图制作一个每个面上都有不同纹理的立方体。

我现在正面和背面都可以工作。现在我正在尝试制作立方体的右面。但出了问题,因为我完成了正确的脸,但纹理显示错误(就像拉伸和切碎),我的代码中有一些不好的东西,我不知道是什么。

这是我的代码

public class Cube {

private FloatBuffer vertexBuffer;//Vertices
private FloatBuffer textureBuffer;//Texture coordinates
private ByteBuffer indexBuffer;//Indices
private int[] textures = new int[6];//Texture pointer

private float vertices[] = { //8 vertices of the cube
        -1.0f, -1.0f, 1.0f, // 0
        1.0f, -1.0f, 1.0f,  // 1
        -1.0f, 1.0f, 1.0f,  // 2
        1.0f, 1.0f, 1.0f,   // 3

        -1.0f, -1.0f, -1.0f,// 4
        1.0f, -1.0f, -1.0f, // 5
        -1.0f, 1.0f, -1.0f, // 6
        1.0f, 1.0f, -1.0f,  // 7
};

private byte indices[] = { //Faces definition
        0,1,2, 1,3,2, //front face (*)
        6,7,5, 6,5,4, //rear face (**)
        1,5,3, 5,7,3, //right face (***) //problems here
};

private float texture[] = {//Mapping coordinates for the vertices
        0.0f, 1.0f,
        1.0f, 1.0f,
        0.0f, 0.0f,
        1.0f, 0.0f,

        0.0f, 1.0f,
        1.0f, 1.0f,
        0.0f, 0.0f,
        1.0f, 0.0f,

        0.0f, 1.0f,
        1.0f, 1.0f,
        0.0f, 0.0f,
        1.0f, 0.0f,
};

public Cube() 
{
    ByteBuffer byteBuf = ByteBuffer.allocateDirect(vertices.length * 4);
    byteBuf.order(ByteOrder.nativeOrder());
    vertexBuffer = byteBuf.asFloatBuffer();
    vertexBuffer.put(vertices);
    vertexBuffer.position(0);

    byteBuf = ByteBuffer.allocateDirect(texture.length * 4);
    byteBuf.order(ByteOrder.nativeOrder());
    textureBuffer = byteBuf.asFloatBuffer();
    textureBuffer.put(texture);
    textureBuffer.position(0);

    indexBuffer = ByteBuffer.allocateDirect(indices.length);
    indexBuffer.put(indices);
    indexBuffer.position(0);
}

public void draw(GL10 gl) {
    //Point to our buffers
    gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
    gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
    //Set the face rotation
    gl.glFrontFace(GL10.GL_CCW);
    //Enable the vertex and texture state
    gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexBuffer);
    gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, textureBuffer);
    //para que no pinte los poligonos que no se ven
    //gl.glEnable(GL10.GL_CULL_FACE);
    for(int i=0; i<3; i++) //<6 por que tenemos 6 texturas que queremos poner en las 6 caras de un cubo.
    {
        gl.glBindTexture(GL10.GL_TEXTURE_2D, textures[i]);
        indexBuffer.position(6*i); //como cada dos triangulos (cuadrado) forman una cara, estos dos triangulos son 6 indices del array de indices, por lo tanto avanzamos 6 posiciones en el indexBuffer para pintar el siguiente cuadrado.
        gl.glDrawElements(GL10.GL_TRIANGLES, 6, GL10.GL_UNSIGNED_BYTE, indexBuffer); //el segundo parametro es 6 por que solo queremos pintar una cara (cuadrado) por textura.
    }
    //gl.glDisable(GL10.GL_CULL_FACE); //para que no pinte los poligonos que no se ven
    //Disable the client state before leaving
    gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
    gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
}

public void loadGLTexture(GL10 gl, Context context) {
    loadTexture(gl,context,R.drawable.s1,0);
    loadTexture(gl,context,R.drawable.s2,1);
    loadTexture(gl,context,R.drawable.s3,2);
    loadTexture(gl,context,R.drawable.s4,3);
    loadTexture(gl,context,R.drawable.s5,4);
    loadTexture(gl,context,R.drawable.s6,5);
}

public void loadTexture(GL10 gl, Context context, int drawable, int textureNumber)
{
    //Get the texture from the Android resource directory
    InputStream is = context.getResources().openRawResource(drawable);
    Bitmap bitmap = null;
    try {
        //BitmapFactory is an Android graphics utility for images
        bitmap = BitmapFactory.decodeStream(is);
    } finally {
        //Always clear and close
        try {
            is.close();
            is = null;
        } catch (IOException e) {
        }
    }
    //Generate one texture pointer...
    gl.glGenTextures(1, textures, textureNumber);
    //...and bind it to our array
    gl.glBindTexture(GL10.GL_TEXTURE_2D, textures[textureNumber]);
    //Create Nearest Filtered Texture
    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_NEAREST);
    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_LINEAR);
    //Different possible texture parameters, e.g. GL10.GL_CLAMP_TO_EDGE
    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_S, GL10.GL_REPEAT);
    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_T, GL10.GL_REPEAT);
    //Use the Android GLUtils to specify a two-dimensional texture image from our bitmap
    GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap, 0);
    //Clean up
    bitmap.recycle();
}
}

在 OpenGL 中,顶点是位置和/或纹理坐标和/或颜色和/或任意更多属性的组合。因此,尽管您列出了 12 个纹理坐标,但 OpenGL 从您的数据中获取的所有顶点都是 8 个不同的顶点,每个顶点都有一个位置和一个纹理坐标。

您的右面由两个三角形组成,一个具有顶点 1、5 和 3,另一个具有顶点 5、7 和 3。因此,这在概念上与具有顶点 1、5、7 和 3 的四边形相同。

根据您自己的数据,该四边形有顶点:

location: 1.0f, -1.0f,  1.0f; coordinate: 1.0f, 1.0f
location: 1.0f, -1.0f, -1.0f; coordinate: 1.0f, 1.0f
location: 1.0f,  1.0f, -1.0f; coordinate: 1.0f, 0.0f
location: 1.0f,  1.0f,  1.0f; coordinate: 1.0f, 0.0f

因此,您希望它显示沿着纹理右侧延伸并延伸到整个面部的一维直线。这就是你所看到的吗?

如果要为侧面的角提供唯一的纹理坐标,则需要为它们提供唯一的顶点(尽管它们将恰好位于其他顶点的顶部)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

立方体纹理问题 的相关文章

  • 类型容器“Android 依赖项”引用不存在的库 android-support-v7-appcompat/bin/android-support-v7-appcompat.jar

    我在尝试在我的项目中使用 Action Bar Compat 支持库时遇到了某种错误 我不知道出了什么问题 因为我已按照此链接中的说明进行操作 gt http developer android com tools support libr
  • 如何重试已消耗的 Observable?

    我正在尝试重新执行失败的已定义可观察对象 一起使用 Retrofit2 和 RxJava2 我想在单击按钮时重试特定请求及其订阅和行为 那可能吗 service excecuteLoginService url tokenModel Ret
  • android中向sqlite中插入大量数据

    目前 我必须一次向我的 Android 中插入超过 100 亿条数据 然而 内存不足的问题会使程序崩溃 sqlite 插入测试非常简单 只需使用 for 循环生成 sql 插入命令并通过 开始 和 提交 进行包装 private Array
  • SearchView过滤ListView

    我已经实现了搜索视图来过滤我的列表视图项目 当我输入任何文本时 它会过滤列表 但当我退出搜索视图时 它不会返回原始列表项 public class PlacesListAdapter extends ArrayAdapter
  • 找不到 com.google.firebase:firebase-core:9.0.0 [重复]

    这个问题在这里已经有答案了 在遵循有些不一致的指示之后here https firebase google com docs admob android quick start name your project and here http
  • 谷歌坐标认证

    当我尝试连接到 Google 坐标时 总是出现异常GoogleAuthException 我拥有 Google 地图协调中心许可证 我确实使用我的包应用程序名称和 SHA1 在 google 控制台中创建了我的客户端 ID 我将权限添加到清
  • 如何在android中获取Camera2 API的当前曝光

    In android hardware Camera旧的 我使用下面的代码获取当前曝光并获取它Camera Camera Parameters param mCamera getParameters currentExposure para
  • java.lang.NoClassDefFoundError:org.apache.batik.dom.svg.SVGDOMImplementation

    我在链接到我的 Android LibGDX 项目的 Apache Batik 库时遇到了奇怪的问题 但让我们从头开始 在 IntelliJ Idea 中我有一个项目 其中包含三个模块 Main Android 和 Desktop 我强调的
  • 在画布上绘图

    我正在编写一个 Android 应用程序 它可以在视图的 onDraw 事件上直接绘制到画布上 我正在绘制一些涉及单独绘制每个像素的东西 为此我使用类似的东西 for int x 0 x lt xMax x for int y 0 y lt
  • Android 中 Kotlin 协程的正确使用方式

    我正在尝试使用异步更新适配器内的列表 我可以看到有太多的样板 这是使用 Kotlin 协程的正确方法吗 这个可以进一步优化吗 fun loadListOfMediaInAsync async CommonPool try Long runn
  • CollapsingToolBarLayout - 状态栏稀松布颜色不改变

    几天前我更新了我的 android studio 并开始使用 CoordinatorLayout 和 CollapsingToolbarLayout 只是尝试一些东西 工具栏稀松布颜色似乎覆盖了状态栏初始颜色和状态栏稀松布颜色 从 xml
  • 带有 EditText 和 Spinner 的对话框

    我有一个按钮 单击后会弹出一个对话框 我希望对话框有一个EditText and a Spinner对话框内 我不知道如何设置它的视图 我有一个代码AlertDialog它有效 只是EditText and Spinner我需要将其放入其中
  • 如何使用 Cordova 获取当前安装的应用程序的版本?

    我已经找到了应用程序可用性插件 https github com ohh2ahh AppAvailability它主要检查用户是否在其设备上安装了某个应用程序 是否有可能获得应用程序的当前版本 开发者名称 重要 以及所有可能的信息 一般来说
  • Android Studio 0.4.3 Eclipse项目没有gradle

    在此版本之前 在 Android Studio 中按原样打开 Eclipse 项目似乎很容易 无需任何转换 我更喜欢 Android Studio 环境 但我正在开发一个使用 eclipse 作为主要 IDE 的项目 我不想只为这个项目下载
  • Android Studio - Windows 7 上的 Android SDK 问题

    我对 Google i o 2013 上发布的最新开发工具 Android Studio 有疑问 我已经成功安装了该程序并且能够正常启动 我可以导入现有项目并对其进行编辑 但是 当我尝试单击 SDK 管理器图标或 AVD 管理器图标时 或者
  • Android 中麦克风的后台访问

    是否可以通过 Android 手机上的后台应用程序 服务 持续监控麦克风 我想做的一些想法 不断聆听背景中的声音信号 收到 有趣的 音频信号后 执行一些网络操作 如果前台应用程序需要的话 后台应用程序必须能够智能地放弃对麦克风的访问 除非可
  • Android向menuItem添加子菜单,addSubMenu()在哪里?

    我想根据我的参数以编程方式将 OptionsMenu 内的子菜单添加到 menuItem 中 我检查了android sdk中的 MenuItem 没有addSubMenu 方法 尽管你可以找到 hasSubMenu 和 getSubMen
  • 一次显示两条Toast消息?

    我希望在一个位置显示一条 Toast 消息 并在另一位置同时显示另一条 Toast 消息 多个 Toast 消息似乎总是按顺序排队和显示 是否可以同时显示两条消息 是否有一种解决方法至少可以提供这种外观并且不涉及扰乱活动布局 Edit 看来
  • 将两个文本视图并排放置在布局中

    我有两个文本视图 需要在布局中并排放置 并且必须遵守两条规则 Textview2 始终需要完整显示 如果布局中没有足够的空间 则必须裁剪 Textview1 例子 文本视图1 文本视图2 Teeeeeeeeeeeeeeeeeextview1
  • Crashlytics 出现 Android Studio 构建错误

    我正在尝试将 CrashLytics 与 Android Studio 和 gradle 一起使用 但出现一个令人困惑的错误 java lang NoSuchMethodError 我的 build gradle 是 buildscript

随机推荐

  • Django - 如何标准化数据库? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 我一直问人们应该如何组织我的模型 他们一直告诉我规范化数据库 有人能给我看一个规范化 Django 模型的示例吗 规范化不是 Django 甚至 P
  • Rails:如何将文件从 S3 发送到远程服务器

    我一直在四处寻找 似乎找不到一个好的解决方案 我的 Rails 应用程序将其文件存储在 Amazon S3 中 我现在需要将它们发送到远程 第三方 服务 我正在使用 RestClient 发布到第三方服务器 如下所示 send file R
  • 如何在 Jest 中跟踪失败的异步测试?

    更新 问题已经确定 在实际的代码库中 断言被传递给导入的回调 一旦回调执行失败的测试 它就会引发承诺拒绝 因此 这与测试的实际编写方式很接近 describe file system gt it should check if the fi
  • 如何使用 Xamarin Forms 更改导航页面标题的字体?

    我可以像这样改变字体颜色 var homePage new NavigationPage new HomePage Title Home Icon ionicons 2 0 1 home outline 25 png BarTextColo
  • 脚本桥接并生成 Microsoft Word 头文件

    我正在尝试让 Cocoa 应用程序连接到 Microsoft Word 从我的搜索来看 唯一的方法似乎是使用 Scripting Bridge 并生成 Word 头文件 但是 使用苹果示例项目中解释的方法SBS发送电子邮件 sdef INP
  • 如何在 JavaScript 中对字符串进行排序

    我有一个对象列表 我希望根据字段进行排序attr字符串类型 我尝试使用 list sort function a b return a attr b attr 但发现 似乎不适用于 JavaScript 中的字符串 如何根据字符串类型的属性
  • 出现错误时如何退出 rpm 安装

    我正在寻找一种在某些条件不成立时退出 rpm 安装的方法 我在 pre 部分添加了一个小脚本 如果我的条件失败 该脚本将退出安装 我面临的问题是我看到 pre scriptlet 被执行 并且 rpm 安装失败 然而最后我得到了我不想要的这
  • 将函数形式从代码作为字符串应用/映射到新函数体中

    我想获取用户的代码并进行转换reactive 调用这样的函数 a lt reactive input n 100 并将其转换为 a lt function input n 100 这是我的一部分闪亮的物体包裹 我已经整理了一个解决方案 但我
  • 如何在 PropertyGrid 中重新标记模式 UITypeEditor 的省略号按钮?

    我有一个 Windows 窗体 PropertyGrid 和一个客户 UITypeEditorhttp msdn microsoft com en us library system drawing design uitypeeditore
  • PHP 的问题包括区分大小写的文件系统

    我在 Windows 中构建了一个 PHP 项目 正如你所知 在 Windows 中 fun php 和 Fun php 是相同的 但在 Linux 中不同 Q1 gt 由于我的项目将在 Linux 中运行 如何解决这个问题 文件名错误 Q
  • C语言中反斜杠的用法

    在C语言中 如果反斜杠后面没有任何内容 它会起作用吗 我在 case a 的分隔符后添加了 但它对任何事情都没有影响 那么这里的 有什么作用呢 include
  • Firebase 身份验证失败,并显示 auth/network-request-failed 网络错误(例如超时

    我在尝试进行 Firebase 身份验证时遇到了非常奇怪的行为 更重要的是 我制作了一个可以运行的版本和一个不能运行的版本 首先 有效的版本
  • IntelliJ 集成 Play 2 应用程序抛出库“scala-2.10.0-RC1 未使用”

    我刚刚生成了一个新的 Play 应用程序 版本 2 1 RC1 这包括两个 Scala 编译器 库对 斯卡拉2 9 2 斯卡拉 2 10 0 RC1 整个过程可以在 IntelliJ IDEA 12 中编译 但是warning如图所示 看来
  • Meteor - 插入失败:找不到方法

    我的 Meteor 的 JS 文件有问题 当我尝试将任何数据插入数据库并反映在图表上时 出现此错误 插入失败 找不到方法 我尝试过直接从数据库获取数据 但也不起作用 提前致谢 LinePeople new Mongo Collection
  • 将网络位置保存为 .txt 文件(不使用 GPS)

    我是android编程的初学者 我的研究生项目是关于跟踪移动设备 我需要代码将位置 不使用 GPS 保存为文本文件 有人建议我执行此操作的代码 这对我来说会有很大的帮助 尝试这个 locationManagerNetwork Locatio
  • 我可以在没有 Google Apps 脚本的情况下在 Google 电子表格上创建自定义函数吗?

    我正在使用带有 Google Apps 脚本的 google 电子表格 但它很容易给我错误信息 像这样 Error此 Google 用户帐户每秒调用脚本的次数过多 第 0 行 有什么办法可以避免该错误吗 reduce函数调用方式除外 或者支
  • 密码的javascript正则表达式至少包含8个字符,1个数字,1个大写字母和1个小写字母[重复]

    这个问题在这里已经有答案了 我正在尝试编写一个正则表达式来验证密码 该密码必须满足以下条件 至少包含8个字符 至少包含 1 个数字 至少包含 1 个小写字符 a z 至少包含 1 个大写字符 A Z 仅包含 0 9a zA Z 我尝试了以下
  • SQL Server 中的更新顺序

    创建脚本 CREATE TABLE dbo tblTEST AccountNO varchar 10 NOT NULL Serial int NOT NULL AccountType varchar 1 NOT NULL Due money
  • 使用 WMI 监控驱动器

    我正在尝试监控本地电脑的驱动器 我对两个事件感兴趣 驱动器连接 USB 驱动器 CD ROM 网络驱动器等 和断开连接时 我使用 ManagementOperationObserver 编写了一个快速概念证明 它部分有效 现在 使用下面的代
  • 立方体纹理问题

    我试图制作一个每个面上都有不同纹理的立方体 我现在正面和背面都可以工作 现在我正在尝试制作立方体的右面 但出了问题 因为我完成了正确的脸 但纹理显示错误 就像拉伸和切碎 我的代码中有一些不好的东西 我不知道是什么 这是我的代码 public