我正在用JavaFX 3D開發一款遊戲,玩家沿着漫長的道路奔跑。他的方式有物品和障礙。重點是:現在,如果物體進入我的裁剪距離,它們就會從無處出現。因此,我想創建一些霧(或任何其他「隱藏」對象的初始化)如何在JavaFX 3D中創建霧?
問題是,我找不到任何這樣做的例子。我正在尋找一個示例代碼/鏈接來源/任何其他建議。
我正在用JavaFX 3D開發一款遊戲,玩家沿着漫長的道路奔跑。他的方式有物品和障礙。重點是:現在,如果物體進入我的裁剪距離,它們就會從無處出現。因此,我想創建一些霧(或任何其他「隱藏」對象的初始化)如何在JavaFX 3D中創建霧?
問題是,我找不到任何這樣做的例子。我正在尋找一個示例代碼/鏈接來源/任何其他建議。
說了這個問題太廣泛了,而且必須有很多種方法才能做到這一點,這裏有一個可能的實現。這是2D,但可以很容易地適應3D應用程序(我認爲)。這個想法只是讓一些淺灰色的圓圈在白色背景上漂移,並對整個事物施加巨大的模糊。
然後,你可以讓你的對象以此作爲背景出現,並將它們從灰色淡入到它們的真實顏色(或其他顏色)。顏色和圓的速度,並且模糊半徑,可能需要一些調整...
import java.util.Random;
import javafx.animation.AnimationTimer;
import javafx.application.Application;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.effect.GaussianBlur;
import javafx.scene.layout.Pane;
import javafx.scene.layout.StackPane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Circle;
import javafx.scene.shape.Rectangle;
import javafx.stage.Stage;
public class FogExample extends Application {
private static final int WIDTH = 600 ;
private static final int HEIGHT = 600 ;
@Override
public void start(Stage primaryStage) {
Fog fog = new Fog(WIDTH, HEIGHT);
Scene scene = new Scene(new StackPane(fog.getView()), WIDTH, HEIGHT);
primaryStage.setScene(scene);
primaryStage.show();
}
public static class Fog {
private final int width ;
private final int height ;
private final Pane fog ;
private final Random RNG = new Random();
public Fog(int width, int height) {
this.width = width ;
this.height = height ;
this.fog = new Pane();
Rectangle rect = new Rectangle(0, 0, width, height);
rect.setFill(Color.rgb(0xe0, 0xe0, 0xe0));
fog.getChildren().add(rect);
for (int i = 0; i < 50; i++) {
fog.getChildren().add(createFogElement());
}
fog.setEffect(new GaussianBlur((width + height)/2.5));
}
private Circle createFogElement() {
Circle circle = new Circle(RNG.nextInt(width - 50) + 25, RNG.nextInt(height - 50) + 25, 15 + RNG.nextInt(50));
int shade = 0xcf + RNG.nextInt(0x20);
circle.setFill(Color.rgb(shade, shade, shade));
AnimationTimer anim = new AnimationTimer() {
double xVel = RNG.nextDouble()*40 - 20 ;
double yVel = RNG.nextDouble()*40 - 20 ;
long lastUpdate = 0 ;
@Override
public void handle(long now) {
if (lastUpdate > 0) {
double elapsedSeconds = (now - lastUpdate)/1_000_000_000.0 ;
double x = circle.getCenterX() ;
double y = circle.getCenterY() ;
if (x + elapsedSeconds * xVel > width || x + elapsedSeconds * xVel < 0) {
xVel = - xVel ;
}
if (y + elapsedSeconds * yVel > height || y + elapsedSeconds * yVel < 0) {
yVel = - yVel ;
}
circle.setCenterX(x + elapsedSeconds*xVel);
circle.setCenterY(y + elapsedSeconds * yVel);
}
lastUpdate = now ;
}
};
anim.start();
return circle ;
}
public Node getView() {
return fog ;
}
}
public static void main(String[] args) {
launch(args);
}
}
典型的3D系統使用粒子系統要做到這一點,涉及的透明性,阿爾法波動,廣告牌的紋理組合。相信與否霧,煙和火焰......粒子效果......實際上並不是3D,而是2D,定位,尺寸和着色以3D形式出現的圖像。然後,它們的動畫足夠快,以便人類觀看者無法辨別2D圖像的細微差別。 JavaFX 3D的問題在於它不支持透明度「尚未」(它是非正式可用的)。此外,沒有粒子類型的對象可以讓你像James_D所建議的那樣重疊形狀和紋理,而無需手動管理相機的定位。 但是有希望...... F(X)yz項目提供了一個BillBoard類,它可以讓你放置一個垂直於相機的圖像。您可以使用計時器和一些Random.next()類型快速更新此圖像使用James_D建議的方法爲霧創建圓形創建。以這種方式使用BillBoard的一個例子是BillBoardBehaviourTest和CameraViewTest。性能在CameraViewTest中演示。 如果我是你,我會做的是在你的frustrum的後面-Z位置(對象進入場景的位置)設置一個大的粗糙的BillBoard對象,然後在屏幕外的窗格中設置一個定時器/隨機循環生成器。然後使用CameraViewTest中的方法,快照屏幕窗格(其中包含圓圈),然後將該圖像設置爲BillBoard。您必須將SnapShot呼叫置於某個計時器上才能實現動畫效果。 CameraViewTest演示瞭如何做到這一點。對用戶的影響將是一堆移動模糊的小圈子。
便宜的霧!
太寬泛的問題提供了一個明確的答案,但也許['FadeTransition'](http://docs.oracle.com/javase/8/javafx/api/javafx/animation/FadeTransition.html)會幫幫我。 –