gpt4 book ai didi

android OpenGL ES坐标映射

转载 作者:行者123 更新时间:2023-11-30 04:27:01 25 4
gpt4 key购买 nike

我做了很多搜索,但没有解决我的问题。我是 android 和 3d 编程的新手。我正在开发一个 Android 项目,我需要使用 opengl es 在 android 设备上绘制一个 3d 对象。对于每个像素,我有 200 到 9000 之间的距离值,需要将其映射为 Z 坐标。对象是 320x240。

问题是:

  • 如何从 (x,y,z) 映射到 opengl es 坐标系?我创建了一个顶点数组,其值为 {50f、50f、400f、50f、51f、290f、...}。每个像素表示为 3 个 float (x,y,z)。
  • 如何在 android 上使用 opengl 绘制这个顶点数组?
  • 是否可以使用 OpenGl ES 绘制 320*240 像素?

最佳答案

OpenGL 不能很好地处理大数字(就像任何超过 10.0f 的东西,只是它的设计方式)。最好将您的坐标转换为 -1 和 1 之间(即归一化),而不是尝试让 openGL 使用 50f 或 290f 的坐标。

坐标被归一化到 -1 和 1 之间的原因是因为模型坐标只应该是彼此相对的,而不是表示它们在特定游戏/应用程序中的实际尺寸。该模型可用于具有不同坐标系的许多不同游戏/应用程序,因此您希望所有模型坐标都采用某种规范化的标准形式,以便程序员可以按照自己的方式进行解释。

为了归一化,您遍历所有坐标并找到离 0 最远的值,即

float maxValueX = 0;
float maxValueY = 0;
float maxValueZ = 0;

// find the max value of x, y and z
for(int i=0;i<coordinates.length'i++){
maxValueX = Math.max(Math.abs(coordinates[i].getX()), maxValueX);
maxValueY = Math.max(Math.abs(coordinates[i].getY()), maxValueY);
maxValueZ = Math.max(Math.abs(coordinates[i].getZ()), maxValueZ);
}

// convert all the coordinates to be between -1 and 1
for(int i=0;i<coordinates.length'i++){
Vector3f coordinate = coordinates[i];
coordinate.setX(coordinate.getX() / maxValueX);
coordinate.setY(coordinate.getY() / maxValueY);
coordinate.setZ(coordinate.getZ() / maxValueZ);
}

你只需要这样做一次。假设您将数据存储在一个文件中,您可以编写一个小实用程序来对文件执行上述操作并保存它,而不是每次将数据加载到您的应用程序时都这样做

关于android OpenGL ES坐标映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8319619/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com