カメラ
CameraNodeは指定の領域の描画結果を写し撮るノードです。既定では写し撮った領域は画面に描画されます。CameraNodeが撮影する領域はAngle、CenterPosition、Position、Scale プロパティを用いることで設定できます。
Note
既定では、CameraNodeが撮影する領域は、点 (0, 0) を左上とする、ウインドウサイズと同じ大きさ(TargetTextureを設定した場合はその大きさ)の長方形の領域です。上記の各種プロパティを設定してこの長方形を変形することで、撮影する領域を調整すると考えるとよいです。
描画結果を RenderTexure として取り出して再利用することもできます。Material などを付けて再描画することができます。
Important
エンジンにカメラが一つも登録されていない場合は、暗黙的に存在するデフォルトカメラによって登録されている描画できる全てのノードが描画されます。しかし エンジンにカメラが一つでも登録した場合は、デフォルトカメラが無効化されるため、下記のCameraGroup プロパティを適切に設定していないノードは描画されません。
クリア
IsColorCleared プロパティを設定することで、CameraNodeが描画を開始する前、描画領域をクリアすることができます。その際の色は ClearColor プロパティで設定できます。クリアを行わないと、前のフレームの描画結果に上書きして描画した結果が得られます。
Note
複数のカメラの描画結果を画面に出力する場合、透明な色でクリアすることによって、より下に(先に)出力されるカメラの描画結果も表示することができます。
グループ
SpriteNode や PostEffectNode のような描画できるノードが持っているCameraGroup プロパティは、どのカメラの描画によって描画されるかを指定するものです。 描画の対象となるCameraGroupは、CameraNodeクラスが持つGroup プロパティと、 CameraGroup プロパティの AND 演算の結果が 0 以外である場合、描画します。
Note
CameraNode は Group プロパティの値に従い 降順 に描画結果を生成します。これはペイントソフトなどにおけるレイヤーの重ね順のように機能します。
Important
上記の通り、画面もしくはRenderTexure への描画はGroup プロパティの値に従い 降順 に行われます。RenderTexureへの描画結果をSpriteNodeなどで再利用する場合、そのSpriteNodeはRenderTexureへの描画を行ったCameraGroupよりもGroup プロパティの値がより大きいCameraGroupによって撮影する場合のみ正常に描画されます。Group プロパティの値が同じか、より小さいCameraNodeによって撮影しようとした場合、RenderTexure への描画がその時点でまだ行われていないため、何も描画されていないか1フレーム前の描画結果を使用して描画が行われます。
サンプル
カメラ
using System;
using Altseed2;
namespace Sample
{
class Camera
{
[STAThread]
static void Main(string[] args)
{
const ulong cameraGroup = 0b1;
// Altseed2 を初期化します。
if (!Engine.Initialize("Camera", 640, 480)) return;
// SpriteNode を作成します。
// 詳しくは SpriteNode のサンプルを参照してください。
var sprite = new SpriteNode();
// テクスチャを設定します。
sprite.Texture = Texture2D.Load(@"TestData/IO/AltseedPink256.png");
sprite.CameraGroup = cameraGroup;
Engine.AddNode(sprite);
// sprite の座標を設定します。
sprite.Position = new Vector2F(100, 100);
// カメラノードを作成します。
var camera = new CameraNode();
// カメラが映す対象とするグループを設定します。
camera.Group = cameraGroup;
// カメラが映す箇所の座標を設定します。
camera.Position = new Vector2F(100, 100);
// カメラノードを登録します。
Engine.AddNode(camera);
// メインループ。
// Altseed のウインドウが閉じられると終了します。
while (Engine.DoEvents())
{
// Altseed を更新します。
Engine.Update();
}
// Altseed の終了処理をします。
Engine.Terminate();
}
}
}
RenderTexture
using System;
using Altseed2;
namespace Sample
{
class Camera_RenderTexture
{
[STAThread]
static void Main(string[] args)
{
const ulong cameraGroup = 0b1;
const ulong cameraGroup2 = 0b10;
// Altseed2 を初期化します。
if (!Engine.Initialize("RenderTexture", 640, 480)) return;
// SpriteNode を作成します。
// 詳しくは SpriteNode のサンプルを参照してください。
var sprite = new SpriteNode();
sprite.Texture = Texture2D.Load(@"TestData/IO/AltseedPink256.png");
sprite.CameraGroup = cameraGroup;
sprite.Scale = new Vector2F(200, 200) / sprite.Texture.Size;
Engine.AddNode(sprite);
// スクリーンのように描画先にできるテクスチャを作成します。
var renderTexture = RenderTexture.Create(new Vector2I(200, 200), TextureFormat.R8G8B8A8_UNORM);
// sprite を写してrenderTexture に出力する CameraNode を作成します。
// 詳しくは CameraNode のサンプルを参照してください。
var camera = new CameraNode();
camera.Group = cameraGroup;
Engine.AddNode(camera);
// カメラの描画先を設定します。
// null のとき出力先はスクリーンになります。
camera.TargetTexture = renderTexture;
// 描画する前に TargetTexture を指定色で塗りつぶすかどうかを設定します。
camera.IsColorCleared = true;
// 塗りつぶす色を設定します。
camera.ClearColor = new Color(100, 100, 100);
// renderTexture をスクリーンに描画するための SpriteNode を作成します。
var sprite2 = new SpriteNode();
sprite2.Texture = renderTexture;
sprite2.CameraGroup = cameraGroup2;
Engine.AddNode(sprite2);
// sprite2 を写してスクリーンに出力するカメラを作成します。
var camera2 = new CameraNode();
camera2.Group = cameraGroup2;
Engine.AddNode(camera2);
// メインループ。
// Altseed のウインドウが閉じられると終了します。
while (Engine.DoEvents())
{
// Altseed を更新します。
Engine.Update();
}
// Altseed の終了処理をします。
Engine.Terminate();
}
}
}