Java (处理)如何根据屏幕移动3D对象';s XY轴,而不是世界';s X,Y,Z(皮斯康)
我正在写一个3D草图,用户在左键单击并移动鼠标的同时用摄像头旋转相机。问题是,我想在按下鼠标右键的同时移动对象,这样用户就可以在屏幕的X轴和Y轴上拖动对象。当然,我知道如何使用mouseX和mouseY输入来修改平移,但只能跨3D空间坐标,如下面的GIF所示: 图像中发生的事件的示例代码:Java (处理)如何根据屏幕移动3D对象';s XY轴,而不是世界';s X,Y,Z(皮斯康),java,matrix,3d,processing,3dcamera,Java,Matrix,3d,Processing,3dcamera,我正在写一个3D草图,用户在左键单击并移动鼠标的同时用摄像头旋转相机。问题是,我想在按下鼠标右键的同时移动对象,这样用户就可以在屏幕的X轴和Y轴上拖动对象。当然,我知道如何使用mouseX和mouseY输入来修改平移,但只能跨3D空间坐标,如下面的GIF所示: 图像中发生的事件的示例代码: import peasy.*; import peasy.org.apache.commons.math.*; import peasy.org.apache.commons.math.geometry.*
import peasy.*;
import peasy.org.apache.commons.math.*;
import peasy.org.apache.commons.math.geometry.*;
PeasyCam cam;
float x=15;float y=15; float z=15;
float e;
void setup(){
size (700,700,P3D);
cam = new PeasyCam(this, 200);
cam.setRightDragHandler(null);
}
void draw(){
background(0);
pushMatrix();
translate(5, 5, 0);
fill(255);
stroke(255);
sphere(5);
popMatrix();
pushMatrix();
fill(255,0,0);
stroke(255,0,0);
translate(x, y, z);
sphere(5);
popMatrix();
stroke(0,0,255);
line(5,5,0,x,y,z);
//obvoiusly not working method
if(mousePressed && (mouseButton == RIGHT)){
x= x+(mouseX-pmouseX);
y= y+(mouseY-pmouseY);
}
}
void mouseWheel(MouseEvent event) {
e = event.getCount();
z=z+e;
println(e);
}
void mousePressed(){
if (mouseButton==RIGHT){
cam.setActive(false);
}
}
void mouseReleased(){
cam.setActive(true);
}
我需要的是能够在屏幕X/Y轴上以固定的Z方向拖动球体,就像下图所示(我对我正在寻找的行为进行了简单的模拟)
PeasyCam用于探索3D空间。这个问题可能很难理解。问题在于如何在3D世界上移动对象,使用屏幕/画布2D坐标使对象跟随光标的移动。如果鼠标向左移动(x轴减小),对象应该在屏幕上向左移动,而不仅仅是在x轴上。这是第二个示例图像的行为方式,但仅通过模拟3D空间来实现,而不实际旋转x、y、z轴。
我一直在为这件事挠头,我似乎弄不明白。否则我就不会在这里问了。提前感谢各位。PeasyCam是一个库,它提供默认情况下由鼠标控制的摄像头。这允许您渲染3D场景,而不必担心摄影机,因为库会为您处理它 但听起来这不是你想要的。要渲染三维场景,请使用鼠标控制该场景中形状的位置。基本上,您的控件与PeasyCam库提供的默认控件发生冲突 我看到您已经尝试禁用此处的右键单击控件:
cam.setRightDragHandler(null);
因此,至少您可能希望对左侧拖动处理程序执行相同的操作
但在这一点上,你为什么要使用PeasyCam库呢
即使禁用默认的左控件,您也会注意到形状的拖动是“夸张的”,因为摄影机更接近红色形状,所以稍微移动它看起来好像移动得更多。就像你面前的一个物体看起来比远处的物体移动得多
听起来您真正想要做的是去掉PeasyCam库,然后使用标准处理函数根据用户输入计算球体的位置。查看中的modelX()
、modelY()
和modelZ()
函数
编辑:下面是一个简单的示例,显示了模型函数的作用:
float x;
float y;
void setup() {
size (700, 700, P3D);
}
void draw() {
background(0);
pushMatrix();
translate(width/2, height/2, 0);
fill(255);
stroke(255);
sphere(5);
popMatrix();
fill(255, 0, 0);
stroke(255, 0, 0);
if (mousePressed) {
x= modelX(mouseX, mouseY, 0);
y= modelY(mouseX, mouseY, 0);
}
translate(x, y, 15);
sphere(5);
}
也许你应该看看beginHUD()和endHUD() 下面是示例代码: (源代码)
PeasyCam用于探索3D空间。我明白了,这个问题很难理解。问题在于如何在3D世界上移动对象,使用屏幕/画布2D坐标使对象跟随光标的移动。如果鼠标向左移动(x轴减小),对象应该在屏幕上向左移动,而不仅仅是在x轴上。这是第二个示例图像的行为方式,但仅通过模拟3D空间来实现,而没有实际旋转到x、y、z轴。@Ross我完全理解您的问题。你的问题是由PeasyCam在拖动时移动相机引起的,这是库默认的操作。在你第二次回复之前编辑了评论,我的坏凯文。谢谢你抽出时间。将此添加到实际问题中。@Ross您是否尝试过研究我在回答中提到的模型函数?我看不出这些函数有什么帮助。您将以什么方式实施它们?我现在正在搜索是否可以使用openGL函数在3D空间上获取鼠标坐标,以便我可以将对象转换为这些坐标(我猜是固定的“z”)。也许这个摄影师可以帮助您实现目标:它非常灵活,支持多种视图模式。
import peasy.*;
PeasyCam cam;
void setup() {
size(300,200,P3D);
// either put it here like this:
// cam = new PeasyCam(this, 50, 0, 0, 100);
cam = new PeasyCam(this, 0, 0, 0, 100);
cam.setMinimumDistance(50);
cam.setMaximumDistance(500);
// or separate like this:
cam.lookAt(50,0,0);
}
void draw() {
background(0);
//3D object
pushMatrix();
fill(255,0,0);
translate(50,0,0);
rotateX(-.5);
rotateY(-.5);
box(30);
popMatrix();
//2D object that is not affected by the camera
cam.beginHUD();
fill(0,0,255);
rect(200, height/2 -25 , 50, 50);
cam.endHUD();
}