Android OpenGL-ES 2.0 sürümündeyim ve beraberinde gelen tüm sınırlamalardan sonra, 2D ekran dokunuşlarını sahip olduğum 3B noktalara nasıl alacağımı anlayamıyorum. Doğru sonuçları alamıyorum.Android OpenGL 3D toplama
Nokta bulutuna bir ışın vurmaya çalışıyorum, böylece noktalarımın mesafelerini ışınla karşılaştırarak en yakın noktayı bulabiliyorum.
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, centerZ,
upX, upY, upZ);
if(pickPointTrigger)
pickPoint(gl);
gl.glPushMatrix();
gl.glTranslatef(_xTranslate, _yTranslate, _zTranslate);
gl.glTranslatef(centerX, centerY, centerZ);
gl.glRotatef(_xAngle, 1f, 0f, 0f);
gl.glRotatef(_yAngle, 0f, 1f, 0f);
gl.glRotatef(_zAngle, 0f, 0f, 1f);
gl.glTranslatef(-centerX, -centerY, -centerZ);
ptCloud.draw(gl);
gl.glPopMatrix();
}
}
}
İşte benim toplama işlevim. Sadece hata ayıklama amacıyla ekranın ortasına yerini belirledik:
public void pickPoint(GL10 gl){
mg.getCurrentState(gl);
double mvmatrix[] = new double[16];
double projmatrix[] = new double[16];
int viewport[] = {0,0,screenWidth, screenHeight};
for(int i=0 ; i<16; i++){
mvmatrix[i] = mg.mModelView[i];
projmatrix[i] = mg.mProjection[i];
}
mg.getCurrentState(gl);
float realY = ((float) (screenHeight) - pickY);
float nearCoords[] = { 0.0f, 0.0f, 0.0f, 0.0f };
float farCoords[] = { 0.0f, 0.0f, 0.0f, 0.0f };
GLU.gluUnProject(screenWidth/2, screenHeight/2, 0.0f, mg.mModelView, 0, mg.mProjection, 0,
viewport, 0, nearCoords, 0);
GLU.gluUnProject(screenWidth/2, screenHeight/2, 1.0f, mg.mModelView, 0, mg.mProjection, 0,
viewport, 0, farCoords, 0);
System.out.println("Near: " + nearCoords[0] + "," + nearCoords[1] + "," + nearCoords[2]);
System.out.println("Far: " + farCoords[0] + "," + farCoords[1] + "," + farCoords[2]);
//Plot the points in the scene
nearMarker.set(nearCoords);
farMarker.set(farCoords);
markerOn = true;
double diffX = nearCoords[0] - farCoords[0];
double diffY = nearCoords[1] - farCoords[1];
double diffZ = nearCoords[2] - farCoords[2];
double rayLength = Math.sqrt(Math.pow(diffX, 2) + Math.pow(diffY, 2) + Math.pow(diffZ, 2));
System.out.println("rayLength: " + rayLength);
pickPointTrigger = false;
}
persepctive zNear değiştirme ve Uzak beklenen sonuçları yok, nasıl bir 1,0-1000,0 perspektiften uzak noktası olabilir 11 birim uzakta mı?
GLU.gluPerspective(gl, 55.0f, (float) screenWidth/(float) screenHeight, 1.0f ,100.0f);
.....
07-18 11:23:50.430: INFO/System.out(31795): Near: 57.574852,-88.60514,37.272636
07-18 11:23:50.430: INFO/System.out(31795): Far: 0.57574844,0.098602295,0.2700405
07-18 11:23:50.430: INFO/System.out(31795): rayLength: 111.74275719790872
GLU.gluPerspective(gl, 55.0f, (float) width/(float) height, 10.0f , 1000.0f);
...
07-18 11:25:12.420: INFO/System.out(31847): Near: 5.7575016,-7.965394,3.6339219
07-18 11:25:12.420: INFO/System.out(31847): Far: 0.057574987,0.90500546,-0.06634784
07-18 11:25:12.420: INFO/System.out(31847): rayLength: 11.174307289026638
Kodumda gördüğünüz herhangi bir öneri veya umarım hatalar aranıyor. Çok takdir edildi. Elimden geldiğince çok kandırıyorum (bu bir süredir bir problem olmuştur).
Biraz ilerleme kaydettim. Sonuçta ** nearCoords ** alabilir ve ** ** farCoords ** (sadece Z_FAR büyüklüğüne giderim) ** yönünde ** ve iterate yineleme ben aslında seçtiğiniz ne biraz yakın. Bunun sizin için nasıl çalıştığını görün. – RedLeader
Yakınlardaki Kapılar yönünde yinelemeyi denemedim, çünkü kısmen de yakınlarımın ya da farCoords'ın ilk etapta tıkladıkları yere çok fazla benzemediği görülüyordu. Ben gluUnProject çalışma (yeni bir şekilde) işe yaramadı fark ettim - gluProject aracılığıyla bazı koordinatları koştu, daha sonra sonuç aldı ve hemen sonra gluUnProject aracılığıyla çalıştı ve tamamen farklı bir şey var. Şu anda ters dönüşümü yapmaya çalışıyorum. Toplamak için lookAt kullandığınızı, ancak çizim için bir dizi dönüşüm olduğunu fark ettim. Neden? – Erhannis
Sadece benim tasarımım, ve onun bir şekilde çalışması, tam olarak değil (soldan sağa, eğer sağa çok yakın olmasaydı, yakınlığı), fakat doğru düzgün bir şekilde .. – RedLeader