我有一个使用directx和openGL的渲染器,以及一个3d场景.视口和窗口具有相同的尺寸.
如何以独立于平台的方式实现给定鼠标坐标x和y的拾取?
我想通过Three.js中的IdMapping进行选择
由于性能问题,我只有一个巨大的几何体,计算如下:
for (var i = 0; i < numberOfVertices; i += 9) {
p1 = new THREE.Vector3(graphData.triangles.vertices[i+0], graphData.triangles.vertices[i+1], graphData.triangles.vertices[i+2]);
p2 = new THREE.Vector3(graphData.triangles.vertices[i+3], graphData.triangles.vertices[i+4], graphData.triangles.vertices[i+5]);
p3 = new THREE.Vector3(graphData.triangles.vertices[i+6], graphData.triangles.vertices[i+7], graphData.triangles.vertices[i+8]);
geometry.vertices.push(new THREE.Vertex( p1.clone() ));
geometry.vertices.push(new THREE.Vertex( p2.clone() ));
geometry.vertices.push(new THREE.Vertex( p3.clone() ));
geometry.faces.push( new THREE.Face3( i/3, i/3+1, i/3+2 ) );
// i want to do something like this:
geometry.colors.push(new THREE.Color(0xFF0000));
geometry.colors.push(new THREE.Color(0xFF0000));
geometry.colors.push(new THREE.Color(0xFF0000));
}
geometry.computeFaceNormals();
var material = new THREE.MeshBasicMaterial({});
var triangles = new THREE.Mesh( geometry, material …Run Code Online (Sandbox Code Playgroud) 选择在OpenGL ES 2.0(iOS)中绘制的对象的最佳方法是什么?
我在画点.
如图所示

我绘制了一组轮廓(多边形)作为GL_LINE_STRIP.现在我想选择鼠标下的曲线(多边形)来删除,在3D中移动..等.
我想知道使用哪种方法:
1.使用OpenGL挑选和选择.(glRenderMode(GL_SELECT))
2.使用拾取射线检查手动碰撞检测,并检查射线是否在每个多边形内.
我打开文件选择Intent,Bellow代码
Intent intent_upload = new Intent();
intent_upload.setType("*/*");
intent_upload.setAction(Intent.ACTION_GET_CONTENT);
activity.startActivityForResult(intent_upload, Constants.FILE_PICK_REQUEST_CODE);
Run Code Online (Sandbox Code Playgroud)
我想从列表中删除联系人选项,请任何人都可以帮助.
我一直在转换自己的个人OGLES 2.0框架,以利用新的iOS 5框架添加的功能GLKit.
在取悦结果之后,我现在希望实现这里描述的基于颜色的拾取机制.为此,您必须访问后台缓冲区以检索触摸的像素RGBA值,然后将其用作顶点/基元/显示对象的唯一标识符.当然,这需要对所有顶点/基元/显示对象进行临时唯一着色.
我有两个问题,我非常感谢你们的帮助:
我有权访问
GLKViewController,GLKView,CAEAGLLayer(的GLKView)和EAGLContext.我还可以访问所有与OGLES 2.0缓冲区相关的命令.如何组合这些来识别我在屏幕上点击的EAGLContext中像素的颜色?鉴于我正在使用顶点缓冲对象进行渲染,是否有一种巧妙的方法来覆盖提供给我的顶点着色器的颜色,首先不涉及修改缓冲的顶点(颜色)属性,其次不涉及添加一个IF语句进入顶点着色器?
我认为(2)的答案是"不",但出于性能和非艰苦的代码改造的原因,我认为与更有经验的人核实是明智的.
我们将非常感激地收到任何建议.感谢您的时间
UPDATE
我现在知道如何使用glReadPixels从活动帧缓冲区读取像素数据.所以我想我只需要对后台缓冲区进行特殊的"独特颜色"渲染,短暂切换到它并读取像素,然后切换回来.这将不可避免地产生视觉闪烁,但我想这是最简单的方法; 肯定比CGImageContextRef从屏幕快照创建一个并分析这种方式更快(也更明智).
尽管如此,关于后缓冲器的任何提示都将非常受欢迎.
我正在制作一个Minecraft克隆作为我的第一个OpenGL项目,我被困在盒子选择部分.选择可靠的盒子的最佳方法是什么?
我一直在研究一些AABB算法,但是没有一个能够很好地解释它们到底做了什么(尤其是超级调整的算法)并且我不想使用我不理解的东西.
由于世界是由立方体组成的,我使用八叉树来消除光线投射计算的一些压力,基本上我唯一需要的是这个函数:
float cube_intersect(Vector ray, Vector origin, Vector min, Vector max)
{
//???
}
Run Code Online (Sandbox Code Playgroud)
光线和原点很容易获得
Vector ray, origin, point_far;
double mx, my, mz;
gluUnProject(viewport[2]/2, viewport[3]/2, 1.0, (double*)modelview, (double*)projection, viewport, &mx, &my, &mz);
point_far = Vector(mx, my, mz);
gluUnProject(viewport[2]/2, viewport[3]/2, 0.0, (double*)modelview, (double*)projection, viewport, &mx, &my, &mz);
origin = Vector(mx, my, mz);
ray = point_far-origin;
Run Code Online (Sandbox Code Playgroud)
min和max是立方体的对角.
考虑到我必须检查的立方体数量,即使是八叉树,我也不确定这是否是正确的方法.
我也试过gluProject,它有效,但非常不可靠,并没有给我选择的立方体面.
编辑
所以这就是我所做的:用光线计算太空中的位置:
float t = 0;
for(int i=0; i<10; i++)
{
Vector p = ray*t+origin;
while(visible octree)
{
if(p inside …Run Code Online (Sandbox Code Playgroud) 我使用Android OpenGL-ES 2.0并且考虑到它带来的所有限制,我无法弄清楚如何将2D屏幕触摸带到我拥有的3D点上.我无法得到正确的结果.
我正在尝试将射线射入点云,然后我可以比较我的点与光线的距离,找到最近的点.
public class OpenGLRenderer extends Activity implements GLSurfaceView.Renderer {
public PointCloud ptCloud;
MatrixGrabber mg = new MatrixGrabber();
...
public void onDrawFrame(GL10 gl) {
gl.glDisable(GL10.GL_COLOR_MATERIAL);
gl.glDisable(GL10.GL_BLEND);
gl.glDisable(GL10.GL_LIGHTING);
//Background drawing
if(customBackground)
gl.glClearColor(backgroundRed, backgroundGreen, backgroundBlue, 1.0f);
else
gl.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
if (PointCloud.doneParsing == true) {
if (envDone == false)
setupEnvironment();
// Clears the screen and depth buffer.
gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
gl.glMatrixMode(GL10.GL_PROJECTION);
gl.glLoadIdentity();
GLU.gluPerspective(gl, 55.0f, (float) screenWidth / (float) screenHeight, 10.0f ,10000.0f);
gl.glMatrixMode(GL10.GL_MODELVIEW);
gl.glLoadIdentity();
GLU.gluLookAt(gl, eyeX, eyeY, eyeZ,
centerX, centerY, …Run Code Online (Sandbox Code Playgroud) 我已经能够找到我点击的地方的世界坐标,并且它还使用深度缓冲区进行检查.为此,使用以下代码:
GLint viewport[4];
GLdouble modelview[16];
GLdouble projection[16];
GLfloat winX,winY;
glGetIntegerv(GL_VIEWPORT, viewport);
glGetDoublev(GL_MODELVIEW_MATRIX, modelview);
glGetDoublev(GL_PROJECTION_MATRIX, projection);
// obtain the Z position (not world coordinates but in range 0 - 1)
GLfloat z_cursor;
winX = (float)x_cursor;
winY = (float)viewport[3]-(float)y_cursor;
glReadPixels(winX, winY, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &z_cursor);
// obtain the world coordinates
GLdouble x, y, z;
gluUnProject(winX, winY, z_cursor, modelview, projection, viewport, &x, &y, &z);
Run Code Online (Sandbox Code Playgroud)
x_cursor和y_cursor是我的光标坐标.
到目前为止这么好,打印x,y,z时,它们似乎很好!
但是现在......在解析包含所有多边形/三角形的文件之后.我把每一个都放在openGL DISPLAY列表中.所以我的程序基本上只调用列表,并翻译/旋转它们.每个对象都有一个唯一的名称.所以我保留的是列表,我没有保留每个对象的点/三角形
我的问题 :
所以我有我点击的世界坐标,但我怎样才能找出哪个对象匹配该位置!
我正在尝试为 3D 场景实现导航技术(在 OpenSceneGraph 中使用 OpenGL)。除其他事项外,用户应该能够点击屏幕上的场景对象以朝它移动。
导航技术应集成到另一个项目中,该项目使用顶点着色器将全局变形应用于场景几何体。这就是问题所在:由于使用顶点着色器使几何体变形,因此将鼠标光标位置取消投影到用户实际选择的地点的世界坐标并不是直接的。但是我需要这些坐标来在我的导航技术中执行正确的相机移动。
执行这种非投影的一种方法是修改顶点着色器(用于变形),让它也将顶点的原始位置和法线存储在单独的纹理中。之后可以在鼠标位置读取这些纹理以获得所需的值。
现在,正如我所说,顶点着色器属于另一个我实际上不想触及的项目。我的导航技术的一个目标是尽可能通用,以便轻松集成到其他项目中。
那么问题来了:到目前为止,OpenSceneGraph 或 OpenGL 中是否有任何我没有考虑的功能?有什么可以让我独立于顶点着色器编码器获得片段的世界坐标的吗?