1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

完走賞ゲットのため小ネタ 25記事を投稿しようとチャレンジ v2Advent Calendar 2023

Day 22

Babylon.js Playground上のサンプルで自分が欲しい部分を ChatGPT に取り出してもらう【完走賞ゲット-22】

Last updated at Posted at 2023-12-20

この記事は、「完走賞ゲットのため小ネタ 25記事を投稿しようとチャレンジ v2 Advent Calendar 2023」の 22日目の記事です。

今回の内容

今回の内容は、Babylon.js Playground上で公開されているサンプルで、自分が欲しい部分がその全体ではなく一部だという時に、ChatGPT に取り出しをやってもらった話についてです。

以下の記事に書いた内容をやる中で、Babylon.js Playground上で公開されていたパーティクルを使った描画をいくつか見ていきました。その中で、パーティクル描画のコアの部分のみを取り出したいということがあり、それをやるのに試しに ChatGPT でやってみたという流れのものです。

●ブラウザのウィンドウをスクリーン上で動かした時の位置の変化が Babylon.js で描画したパーティクルの数・背景の色などに影響する処理【Babylon.js-3】 - Qiita
 https://qiita.com/youtoy/items/1a4bf2fd0eef426dd4a0

実際に試してみる

やってみたこと

まず、上で「パーティクル描画のコアの部分のみを取り出したい」と書いていた話の、対象の 1つが以下です。

●Particle System Examples | Babylon.js Playground
 https://playground.babylonjs.com/#0K3AQ2#3067

ここで公開されている内容は、パーティクルの描画を行う部分以外に、GUI でパーティクル描画のパラメータを変更できるようにする部分が含まれていました。
それらの中の、パーティクルの描画を行う部分のみを取り出そうとしてみました。

ChatGPT に依頼した内容

ChatGPT を使って、上に書いた内容を進めていきます。

以下が、ChatGPT で入力したプロンプトです。

image.png

以下は  Babylon.js Playground上で示されたサンプルです。
描画の処理と、それに加えて、GUI上でスライダーバーなどを使ってパラメータを変える処理が入っています。そのGUI上で操作する処理は除き、最低限のパーティクル描画の部分のみ残したコードを提示してください。
説明なしのコメントなしで、コードのみ提示してください。

### 
var createScene = function () {
    var scene = new BABYLON.Scene(engine);
(以降、省略)

### の下に貼り付けた内容は、Babylon.js Playground上で公開されているサンプルの内容そのままです。

ChatGPT のレスポンス

上記の内容に対して、ChatGPT のレスポンスは以下になりました。

image.png

var createScene = function () {
    var scene = new BABYLON.Scene(engine);

    // Setup environment
    var light0 = new BABYLON.PointLight("Omni", new BABYLON.Vector3(0, 2, 8), scene);
    var camera = new BABYLON.ArcRotateCamera("ArcRotateCamera", -Math.PI / 2, 7 * Math.PI / 16, 20, new BABYLON.Vector3(0, 0, 0), scene);
    camera.attachControl(canvas, true);

    // Ground
    var ground = BABYLON.Mesh.CreatePlane("ground", 50.0, scene);
    ground.position = new BABYLON.Vector3(0, -50, 0);
    ground.rotation = new BABYLON.Vector3(Math.PI / 2, 0, 0);
    ground.material = new BABYLON.StandardMaterial("groundMat", scene);
    ground.material.backFaceCulling = false;
    ground.material.diffuseColor = new BABYLON.Color3(0.3, 0.3, 1);

    // Create a particle system
    var particleSystem = new BABYLON.ParticleSystem("particles", 2000, scene);

    // Texture of each particle
    particleSystem.particleTexture = new BABYLON.Texture("textures/flare.png", scene);

    // Where the particles come from
    particleSystem.emitter = BABYLON.Vector3.Zero(); // the starting position
    particleSystem.minEmitBox = new BABYLON.Vector3(-1, -1, -1); // Bottom Left Front
    particleSystem.maxEmitBox = new BABYLON.Vector3(1, 1, 1); // Top Right Back

    // Colors of all particles
    particleSystem.color1 = new BABYLON.Color4(0.7, 0.8, 1.0, 1.0);
    particleSystem.color2 = new BABYLON.Color4(0.2, 0.5, 1.0, 1.0);
    particleSystem.colorDead = new BABYLON.Color4(0, 0, 0.2, 0.0);

    // Size of each particle (random between...
    particleSystem.minSize = 0.1;
    particleSystem.maxSize = 0.5;

    // Life time of each particle (random between...
    particleSystem.minLifeTime = 0.3;
    particleSystem.maxLifeTime = 1.5;

    // Emission rate
    particleSystem.emitRate = 1500;

    // Blend mode : BLENDMODE_ONEONE, or BLENDMODE_STANDARD
    particleSystem.blendMode = BABYLON.ParticleSystem.BLENDMODE_ONEONE;

    // Set the gravity of all particles
    particleSystem.gravity = new BABYLON.Vector3(0, -9.81, 0);

    // Direction of each particle after it has been emitted
    particleSystem.direction1 = new BABYLON.Vector3(-7, 8, 3);
    particleSystem.direction2 = new BABYLON.Vector3(7, 8, -3);

    // Angular speed, in radians
    particleSystem.minAngularSpeed = 0;
    particleSystem.maxAngularSpeed = Math.PI;

    // Speed
    particleSystem.minEmitPower = 1;
    particleSystem.maxEmitPower = 3;
    particleSystem.updateSpeed = 0.005;

    // Start the particle system
    particleSystem.start();

    return scene;
}

そして、レスポンスの内容を Babylon.js Playground上で動作させてみたところ、問題なく動きました。

image.png

さらに短くする

ChatGPT に入力したプロンプトの中の「コメントなし」というのは、コード内のコメントをなくして良いという意図でしたが、それは意図通りになっていませんでした。
その部分は手動で取り除いて、さらに内容を短くしてみました(それと合わせて、var が使われている部分で const に置きかえて問題ないところを、全て置きかえてしまったりもしました)。

内容は以下の通りです。

const createScene = function () {
  const scene = new BABYLON.Scene(engine);

  const light0 = new BABYLON.PointLight("Omni", new BABYLON.Vector3(0, 2, 8), scene);
  const camera = new BABYLON.ArcRotateCamera("ArcRotateCamera", -Math.PI / 2, 7 * Math.PI / 16, 20, new BABYLON.Vector3(0, 0, 0), scene);
  camera.attachControl(canvas, true);

  const ground = BABYLON.Mesh.CreatePlane("ground", 50.0, scene);
  ground.position = new BABYLON.Vector3(0, -50, 0);
  ground.rotation = new BABYLON.Vector3(Math.PI / 2, 0, 0);
  ground.material = new BABYLON.StandardMaterial("groundMat", scene);
  ground.material.backFaceCulling = false;
  ground.material.diffuseColor = new BABYLON.Color3(0.3, 0.3, 1);

  const particleSystem = new BABYLON.ParticleSystem("particles", 2000, scene);
  particleSystem.particleTexture = new BABYLON.Texture("textures/flare.png", scene);

  particleSystem.emitter = BABYLON.Vector3.Zero(); // the starting position
  particleSystem.minEmitBox = new BABYLON.Vector3(-1, -1, -1); // Bottom Left Front
  particleSystem.maxEmitBox = new BABYLON.Vector3(1, 1, 1); // Top Right Back

  particleSystem.color1 = new BABYLON.Color4(0.7, 0.8, 1.0, 1.0);
  particleSystem.color2 = new BABYLON.Color4(0.2, 0.5, 1.0, 1.0);
  particleSystem.colorDead = new BABYLON.Color4(0, 0, 0.2, 0.0);

  particleSystem.minSize = 0.1;
  particleSystem.maxSize = 0.5;

  particleSystem.minLifeTime = 0.3;
  particleSystem.maxLifeTime = 1.5;

  particleSystem.emitRate = 1500;

  particleSystem.blendMode = BABYLON.ParticleSystem.BLENDMODE_ONEONE;

  particleSystem.gravity = new BABYLON.Vector3(0, -9.81, 0);

  particleSystem.direction1 = new BABYLON.Vector3(-7, 8, 3);
  particleSystem.direction2 = new BABYLON.Vector3(7, 8, -3);

  particleSystem.minAngularSpeed = 0;
  particleSystem.maxAngularSpeed = Math.PI;

  particleSystem.minEmitPower = 1;
  particleSystem.maxEmitPower = 3;
  particleSystem.updateSpeed = 0.005;

  particleSystem.start();

  return scene;
}

おおよそ、自分が得たいと思っていた内容を取り出すことができました。

おわりに

今回、Babylon.js Playground上で公開されているサンプルに対し、ChatGPT にその一部を取り出してもらう、ということを試しました。

Babylon.js に限らず、描画系のプログラムでそのコアの部分だけを取り出したいということがあり、内容を見つつ手動で取り出すというのをやっていました。今回は、それを ChatGPT でやってみたのですが、今回の例ではサクッと意図通りの内容を取り出すことができて、とても便利でした。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?