gpt4 book ai didi

java - (处理)如何根据屏幕的XY轴移动3D对象,而不是世界的X,Y,Z(PeasyCam)

转载 作者:太空宇宙 更新时间:2023-11-04 11:27:21 25 4
gpt4 key购买 nike

我正在编写一个 3D 草图,其中用户使用 peasyCam 旋转相机,同时单击鼠标左键并移动鼠标。问题是我想在按下右键时移动对象,以便用户可以在屏幕的 X 轴和 Y 轴上拖动对象。当然,我知道如何使用 mouseX 和 mouseY 输入来修改平移,但仅限于 3D 空间坐标,如下面的 GIF 所示:

图像中发生的情况的示例代码:

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 世界上移动对象,使用屏幕/ Canvas 2D 坐标使对象跟随光标移动。如果鼠标向左移动(x 轴减小),则对象应在屏幕上向左移动,而不仅仅是在世界的 X 轴上移动。这就是第二个示例图像的行为方式,但只是通过模拟 3D 空间而实现的,没有实际旋转到 x、y、z 轴。

我一直在为这件事摸不着头脑,但似乎无法弄清楚。否则我不会在这里问。提前谢谢大家。

最佳答案

PeasyCam 是一个库,它为您提供默认情况下由鼠标控制的相机。这使您可以渲染 3D 场景,而不必担心相机,因为该库会为您处理它。

但听起来这不是你想要的。您想要渲染 3D 场景使用鼠标控制该场景中形状的位置。基本上,您的控件正在与 PeasyCam 库提供的默认控件进行斗争。

我发现您已经尝试在此处禁用右键单击控件:

cam.setRightDragHandler(null);

因此,至少您可能希望对左侧拖动处理程序执行相同的操作。

但那时,您为什么要使用 PeasyCam 库?

即使您禁用默认的左侧控件,您也会注意到形状的拖动是“夸张的”,因为相机更接近红色形状,因此稍微移动它看起来像是移动得更多。就像你面前的一个物体看起来比远处的物体移动得多。

听起来您真正想做的是摆脱 PeasyCam 库,然后使用标准处理函数根据用户输入计算球体的位置。查看 the reference 中的 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);
}

spheres

关于java - (处理)如何根据屏幕的XY轴移动3D对象,而不是世界的X,Y,Z(PeasyCam),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44191902/

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