在JavaFX 8 3D场景中是否可以沿着光线(例如PickRay)找到点,从3D空间中的任意点开始,使用一些3D方向向量,其中光线与网格中的三角形相交(MeshView内的TriangleMesh)?
我知道这是在Camera/MouseHandler中完成的,用于鼠标拾取,但我无法看到任何方式为任意光线做这件事.
当我在JavaFX中创建我的第一个3D游戏时 - 您可以使用鼠标从零件组装船只.这提出了一个问题,因为JAVAFX似乎没有用于将PerspectiveCamera屏幕2D坐标转换为场景3D空间的原生元素.
这是我正在努力实现的目标.鼠标移动的块应在假想的平面上移动,该平面始终相对于摄像机旋转90°:
我试图用三角函数解决问题而没有太大的成功.我没有附加代码片段,因为我正在寻找更通用的数学解决方案,但如果需要,我会提供它.
所有帮助将不胜感激!
期望的结果:


我在JAVAFX中有一个三角形网格物体,并且想要
要么
特定的三角形网格物体是一个拥有数百万个面孔的icosphere(这就是我使用三角形网格的原因:我需要速度).
我没有使用纹理坐标,因为我无法使用JAVAFX找到它的明确解释,而且我希望有一种更简单的方法.
我正在寻找一种在JavaFX 3D中渲染透明对象的方法.到目前为止,没有.我发现问题https://bugs.openjdk.java.net/browse/JDK-8090548.是否有解决方法或这是我不能使用的东西?如果我需要透明对象,我还需要JavaFX之外的东西(比如Java3D)吗?
所以我到目前为止用于在JavaFX中旋转对象的方法是我将它分成3组,每组都附加一个Rotate并锁定到单个轴,如下所示:
Rotate heading, roll, pitch;
Group normalrotate, rollrotate, verticalrotate;
heading.setAxis(new Point3D(0,1,0));
normalrotate.getTransforms().add(heading);
roll.setAxis(new Point3D(0,0,1));
rollrotate.getTransforms().add(roll);
pitch.setAxis(new Point3D(1,0,0));
verticalrotate.getTransforms().add(pitch);
Run Code Online (Sandbox Code Playgroud)
并且每次我需要旋转对象时都会执行setAngle().这对于前进和滚动非常有效,直到我决定我也需要投球.现在很多OpenGL等教程都说旋转的matix或四元数最适合这种类型的旋转,但是javadoc缺少任何有用的数据.
示例:当我在y轴上旋转对象180度时会发生什么(实际上应该以透明蓝色旋转)
我错过了什么吗?所有帮助将不胜感激.
它是光明节,我正在尝试动画陀螺(dreidel):
我可以让它在自己的轴上旋转.这是我的代码:
import static javafx.scene.paint.Color.*;
import javafx.animation.KeyFrame;
import javafx.animation.KeyValue;
import javafx.animation.Timeline;
import javafx.application.Application;
import javafx.beans.property.DoubleProperty;
import javafx.beans.property.SimpleDoubleProperty;
import javafx.geometry.Point3D;
import javafx.scene.Camera;
import javafx.scene.Group;
import javafx.scene.PerspectiveCamera;
import javafx.scene.Scene;
import javafx.scene.SceneAntialiasing;
import javafx.scene.paint.PhongMaterial;
import javafx.scene.shape.Box;
import javafx.scene.shape.Cylinder;
import javafx.scene.shape.Sphere;
import javafx.scene.transform.Rotate;
import javafx.scene.transform.Translate;
import javafx.stage.Stage;
import javafx.util.Duration;
public class DreidelAnim extends Application {
private double bodyBase = 30;
private double bodyHeight = bodyBase * 3 / 2;
private double baseRadius = bodyBase / 2;
@Override
public void start(Stage stage) throws Exception { …Run Code Online (Sandbox Code Playgroud) 我想在javafx中将文本绘制到球体上。
我尝试将其纯粹保留为javafx。我正在使用PerspectiveCamera。
一种选择是仅绘制3D文本(如果存在),使其接触球体并与查看者平行以提高可读性。更好的选择是将弯曲的文本直接绘制在球体上,同时也面向观察者。
我正在使用JavaFX通过鼠标拖动来移动3D立方体。立方体应停留在x和z轴所跨的平面上。我的解决方案效果很好,但是,如果我用鼠标将多维数据集移动得太快,或者当它遇到具有特定深度(y轴)的对象时,则假定鼠标在y轴和多维数据集上移动开始向前或向后跳跃。有没有一种方法可以将鼠标限制在xz平面上?一个更复杂的解决方案是将y长度投影回xz平面,但是我不知道该怎么做。我看了看JavaFX Moving 3D Objects,但是无法适应我的情况。
到目前为止,我的代码:
private volatile double relMousePosX;
private volatile double relMousePosZ;
public void enableDragMove(PaneBox paneBox) {
Group paneBoxGroup = paneBox.get();
paneBoxGroup.setOnMousePressed((MouseEvent me) -> {
if(isSelected(paneBox) && MouseButton.PRIMARY.equals(me.getButton())) {
relMousePosX = me.getX();
relMousePosZ = me.getZ();
}
});
paneBoxGroup.setOnMouseDragged((MouseEvent me) -> {
if(paneBoxGroup.focusedProperty().get() && MouseButton.PRIMARY.equals(me.getButton())) {
setDragInProgress(paneBox, true);
System.out.println(me.getY()); // should stay small value, but jumps to higher values at times, creating the problem.
paneBoxGroup.setCursor(Cursor.MOVE);
paneBox.setTranslateX(paneBox.getTranslateX() + (me.getX() - relMousePosX));
paneBox.setTranslateZ(paneBox.getTranslateZ() + (me.getZ() - relMousePosZ));
}
});
paneBoxGroup.setOnMouseReleased((MouseEvent …Run Code Online (Sandbox Code Playgroud) javafx-3d ×10
javafx ×9
3d ×6
java ×3
animation ×2
javafx-8 ×2
axis ×1
blender ×1
colors ×1
drag ×1
geometry ×1
intersection ×1
mesh ×1
mouse ×1
quaternions ×1
raycasting ×1
text ×1
transparency ×1
uv-mapping ×1