简体   繁体   English

在使用Java的ARCore中,如何在我的世界中绘制3D三角形/线

[英]In ARCore using java, how can I draw a 3D triangle/line in my world

Completely new to OpenGL/ArCore and having some issues. OpenGL / ArCore的全新概念,存在一些问题。 I would like to simply draw a triangle near an anchor but can't figure out how to do this. 我只想在锚点附近画一个三角形,但不知道该怎么做。 Meanwhile I would also like to draw a line of which I have an origin point & a direction vector. 同时,我还想画一条线,该线有一个原点和一个方向向量。

I am using google's ARCore sample project as a base. 我正在使用Google的ARCore示例项目作为基础。 I can draw a 2D Triangle over this screen using their OpenGL tutorial with the following Triangle class: 我可以使用他们的OpenGL教程和以下Triangle类在此屏幕上绘制2D三角形:

private final String vertexShaderCode =
        // This matrix member variable provides a hook to manipulate
        // the coordinates of the objects that use this vertex shader
        "uniform mat4 uMVPMatrix;" +
        "attribute vec4 vPosition;" +
        "void main() {" +
        // the matrix must be included as a modifier of gl_Position
        // Note that the uMVPMatrix factor *must be first* in order
        // for the matrix multiplication product to be correct.
        "  gl_Position = uMVPMatrix * vPosition;" +
        "}";

private final String fragmentShaderCode =
        "precision mediump float;" +
        "uniform vec4 vColor;" +
        "void main() {" +
        "  gl_FragColor = vColor;" +
        "}";

private final FloatBuffer vertexBuffer;
private final int mProgram;
private int mPositionHandle;
private int mColorHandle;
private int mMVPMatrixHandle;

// number of coordinates per vertex in this array
static final int COORDS_PER_VERTEX = 3;
static float triangleCoords[] = {
        // in counterclockwise order:
        0.0f,  0.622008459f, 0.0f,   // top
       -0.5f, -0.311004243f, 0.0f,   // bottom left
        0.5f, -0.311004243f, 0.0f    // bottom right
};
private final int vertexCount = triangleCoords.length / COORDS_PER_VERTEX;
private final int vertexStride = COORDS_PER_VERTEX * 4; // 4 bytes per vertex

float color[] = { 0.63671875f, 0.76953125f, 0.22265625f, 0.0f };

/**
 * Sets up the drawing object data for use in an OpenGL ES context.
 */
public Triangle() {
    // initialize vertex byte buffer for shape coordinates
    ByteBuffer bb = ByteBuffer.allocateDirect(
            // (number of coordinate values * 4 bytes per float)
            triangleCoords.length * 4);
    // use the device hardware's native byte order
    bb.order(ByteOrder.nativeOrder());

    // create a floating point buffer from the ByteBuffer
    vertexBuffer = bb.asFloatBuffer();
    // add the coordinates to the FloatBuffer
    vertexBuffer.put(triangleCoords);
    // set the buffer to read the first coordinate
    vertexBuffer.position(0);

    // prepare shaders and OpenGL program
    int vertexShader = MyGLRenderer.loadShader(
            GLES20.GL_VERTEX_SHADER, vertexShaderCode);
    int fragmentShader = MyGLRenderer.loadShader(
            GLES20.GL_FRAGMENT_SHADER, fragmentShaderCode);

    mProgram = GLES20.glCreateProgram();             // create empty OpenGL Program
    GLES20.glAttachShader(mProgram, vertexShader);   // add the vertex shader to program
    GLES20.glAttachShader(mProgram, fragmentShader); // add the fragment shader to program
    GLES20.glLinkProgram(mProgram);                  // create OpenGL program executables

}

/**
 * Encapsulates the OpenGL ES instructions for drawing this shape.
 *
 * @param mvpMatrix - The Model View Project matrix in which to draw
 * this shape.
 */
public void draw(float[] mvpMatrix) {
    // Add program to OpenGL environment
    GLES20.glUseProgram(mProgram);

    // get handle to vertex shader's vPosition member
    mPositionHandle = GLES20.glGetAttribLocation(mProgram, "vPosition");

    // Enable a handle to the triangle vertices
    GLES20.glEnableVertexAttribArray(mPositionHandle);

    // Prepare the triangle coordinate data
    GLES20.glVertexAttribPointer(
            mPositionHandle, COORDS_PER_VERTEX,
            GLES20.GL_FLOAT, false,
            vertexStride, vertexBuffer);

    // get handle to fragment shader's vColor member
    mColorHandle = GLES20.glGetUniformLocation(mProgram, "vColor");

    // Set color for drawing the triangle
    GLES20.glUniform4fv(mColorHandle, 1, color, 0);

    // get handle to shape's transformation matrix
    mMVPMatrixHandle = GLES20.glGetUniformLocation(mProgram, "uMVPMatrix");
    MyGLRenderer.checkGlError("glGetUniformLocation");

    // Apply the projection and view transformation
    GLES20.glUniformMatrix4fv(mMVPMatrixHandle, 1, false, mvpMatrix, 0);
    MyGLRenderer.checkGlError("glUniformMatrix4fv");

    // Draw the triangle
    GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, vertexCount);

    // Disable vertex array
    GLES20.glDisableVertexAttribArray(mPositionHandle);
}

Changing the z-values inside the trianglecoords variable doesn't affect drawing the triangle at all so i'm confused as to how to proceed. 更改trianglecoords变量内的z值根本不会影响绘制三角形,因此我对如何进行处理感到困惑。

If you need to know why, I'm trying to do some ray-triangle intersection testing; 如果您想知道为什么,我正在尝试进行射线三角相交测试; it's not working out very well and would like to test how it works with just one triangle. 它的效果不是很好,并且想测试一个三角形的工作方式。 I'm breaking my head over it and it's annoying me greatly how complicated such a seemingly simple action is. 我为此烦恼不已,这种看似简单的动作多么复杂,这真让我很烦。

Thanks in advance! 提前致谢!

edit I'm aware that GL is steep to get into for ARCore. 编辑我知道GL很难涉足ARCore。 My assignment involves playing around with ARCore however, and since I am also using GL for a personal project I really want to get to know it, and not use Unity/Unreal. 我的任务是与ARCore一起玩,而且由于我还将GL用于个人项目,所以我真的很想了解它,而不是使用Unity / Unreal。

You can mimic a line with ShapeFactory.makeCylinder by setting correct parameters. 您可以通过设置正确的参数来使用ShapeFactory.makeCylinder模拟一条线。 However, this would not be in OpenGL but certainly with less overhead for a simple line. 但是,这在OpenGL中不会出现,但是对于简单的一行来说肯定会减少开销。

My approach would be to get the start and end word coodrinate points for the two line ends. 我的方法是获取两行结尾的起始词和结束词coodrinate点。 Then calculate the direction and distance of the line, use the distance as length of the cylinder. 然后计算直线的方向和距离,使用该距离作为圆柱体的长度。 Position the line in the middle of distance and then rotate it accordingly to fit the actual start and end point coodrinates. 将线放置在距离的中间,然后相应地旋转以适合实际的起点和终点。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM