読者です 読者をやめる 読者になる 読者になる

のぐそんブログ

暗いおじさんがシコシコ書くブログです。

Three.jsのカメラについて

カメラの定義方法

カメラの基本的な定義方法は下記。 ※レンダーとシーンの作成は割愛

//カメラのパラメーター
var CAMERA_PARAMETER = { 
  fovy: 60,
  aspect: width / height,
  near: 0.1,
  far: 10.0,
  x: 3.0, 
  y: 2.0,
  z: 5.0, 
  lookAt: new THREE.Vector3(0.0, 0.0, 0.0)
 };
 
 //カメラのインスタンスを作成
 camera = new THREE.PerspectiveCamera(
            CAMERA_PARAMETER.fovy,
            CAMERA_PARAMETER.aspect,
            CAMERA_PARAMETER.near,
            CAMERA_PARAMETER.far
        );
 
 //カメラの位置を設定   
 camera.position.x = CAMERA_PARAMETER.x;
 camera.position.y = CAMERA_PARAMETER.y;
 camera.position.z = CAMERA_PARAMETER.z;
 
 //カメラの注視点を設定
 camera.lookAt(CAMERA_PARAMETER.lookAt); 
 
 //レンダーの第2引数で渡す
 renderer.render(scene, camera);

カメラの種類

three.jsにはカメラが2種類あります。

透視投影(PerspectiveCamera)

透視投影とは、近くのものは大きく、遠くのものほど小さく見える通常目で見る状態に近い表現。

new THREE.PerspectiveCamera(fov, aspect, near, far);
透視投影のパラメータ
fov aspect near far
視野角(0~90) アスペクト比 撮影範囲の手前の距離。nearよりも近くにあるものはレンダリングされない 撮影範囲の最大距離。farより遠くのものはレンダリングされない

平行投影(OrthographicCamera)

オブジェクトの大きさが位置によって変化しない状態。どこからみても同じ大きさになる。

 new THREE.OrthographicCamera(left, right, top, bottom, near , far ); 
平行投影のパラメータ
left right top bottom near far
カメラ中心座標からの左側の長さ カメラ中心座標からの右側の長さ カメラ中心座標からの上側の長さ カメラ中心座標からの下側の長さ 撮影範囲の手前の距離。nearよりも近くにあるものはレンダリングされない 撮影範囲の最大距離。farより遠くのものはレンダリングされない

カメラの中心座標を決める

中心座標というよりも、空間の中での上方向をきめます。

設定値は1、-1、0のいずれかを設定します。

 camera.up.set(x, y, z); 

camera.up.set(1, 0, 0)を設定した場合。

camera.up.set(0, 1, 0)を設定した場合。

camera.up.set(0, 0, 1)を設定した場合。

イマイチ使い所がわかりませんでした。

SELECT文だけの修飾メモ

SELECT文だけの修飾

DISTINCT

検索結果の中で重複した行を取り除いてくれます。 用途としては、データの種類を取得する場合などに使用します。

SELECT DISTINCT 列名
FROM テーブル名

下記のテーブルがあるとした場合、 DISTINCT を使用して、nameの種類を取得できます。

◎userテーブル
name
sato
kato
suzuki
sato
kato
sato

下記で実行。

SELECT DISTINCT name
FROM user
◎結果
name
sato
kato
suzuki

ORDER BY

検索結果の並び替えに使用します。 並び替える列は、列名、もしくは列番号で指定します。

SELECT 列名 
FROM テーブル名
ORDER BY 列名(列番号) 並び順(ASC もしくは DESC。デフォルトはASC)

ASC ・・・ 昇順 DESC ・・・降順

◎userテーブル
age
20
25
19
30
45
50

下記で実行。

SELECT age
FROM user
ORDER BY age DESC
◎結果
age
50
45
30
25
20
19

複数行で並べ替える

ORDER BYをカンマで区切ることで、複数の条件で並び替えができることができます。

SELECT 列名 
FROM テーブル名
ORDER BY 列名1(列番号) 並び順 , 列名2(列番号) 並び順

上記の場合は列名1で並び替えたあと、さらに列名2で並び替えます。

◎userテーブル
age height
20 170
20 160
19 170
30 160
20 180
50 170

下記で実行。

SELECT * 
FROM user
ORDER BY age DESC, height DESC
◎結果
age height
50 170
30 160
20 180
20 170
20 160
19 170

SELECT

SELECT文はテーブルの先頭から、取得数をしていしてデータを取り出す。 取得開始の位置も設定できる。

SELECT 列名
FROM テーブル名
LIMIT 取得行数 OFFSET 先頭から除外する行数
◎userテーブル
age
20
25
19
30
45
50

下記で実行。

SELECT age
FROM user
LIMIT 2 OFFSET 2
◎結果
age
30
25

集合演算子

同じ構造の複数のテーブルのデータを扱う場合に集合演算子を使う。 集合演算子を使う場合は、それぞれのテーブルの列数と、データの型を一致させておく必要があります。

もし、列数が合わない場合などはNULLなどを追加して揃えて数を一致させる。

UNION(和集合)

UNIONはテーブルと、テーブルの検索結果の足し合わせに使います。 ALLキーワードを付けると重複した行もそのまま表示されます。 ALLキーワードがついていない場合は、重複した行は1行で表示されます。

SELECT 列名
FROM テーブルA
UNION (ALL)
SELECT 列名
FROM テーブルB
◎userAテーブル
age
20
25
19
30
45
50
◎userBテーブル
age
50
65
70

下記で実行

SELECT age
FROM userA
UNION
SELECT age
FROM userB
◎結果

ALLキーワードを使ってないので重複している「50」は1行にまとめて表示される。

age
20
25
19
30
45
50
65
70
EXCEPT / MINUS(差集合)

EXCEPTはそれぞれのテーブルの検索結果の差分を求められます。 Oracle DBの場合はMINUSを使います。

SELECT 列名
FROM テーブルA
EXCEPT (ALL)
SELECT 列名
FROM テーブルB
注意

EXCEPTで注意が必要なのは、SELECTの順番です。

先に指定したのが検索結果から、後に指定した検索結果省くので、 先に指定したのがテーブルのデータが基準となります。

A - B と B - Aは結果が異なります。

INTERSECT(積集合)

INTERSECTは2つの検索結果の共通する行を集めます。

SELECT 列名
FROM テーブルA
INTERSECT (ALL)
SELECT 列名
FROM テーブルB

まとめ

SELECT文はSQLでよく使われる命令のようなので、 やれることも多いです。 目的のデータを正しい形で取得できるように練習が必要そうです。

three.jsのライトについてのメモ

three.jsのライトについて

three.jsでは他のオブジェクトとと同じようにライトも追加することができます。

【ライト追加前】

【ライト追加後】

上記のように、ライトは明るさもですが、影の描画に大きく影響します。

ライトの追加方法

ライトのオブジェクトは下記のように追加。

 //シーンを準備
 var scene = new THREE.Scene();

//ライトを作成
 var light = new THREE.DirectionalLight(0xffffff);
 
 //シーンに追加
 scene.add(light);

ライトの種類

ディレクショナルライト(平行光源)

平行光源とは、無限に遠いところからシーン全体に降り注ぐ光の光源のことです。

コードにすると下記になります。

//hex:光の色(16進数)
//intensity:光の強さ(float)

THREE.DirectionalLight ( hex, intensity )

アンビエントライト(環境光)

どの面に対しても一様に照らすライト。 ディレクショナルライトは光が当たっていない箇所が発生するが、アンビエントライトは全体を明るくする場合に使える。全体を明るくしますのでビエントライトによる影はできません。

コードにすると下記になります。

//hex:光の色(16進数)
//intensity:光の強さ(float)
THREE.AmbientLight ( hex, intensity )

ポイントライト(点光源)

全方位に光を発することができる光源。電球などのイメージに近い。 ポイントライトによる影はできません。

コードにすると下記になります。

//hex:光の色(16進数) 
//intensity:光の強さ(float)
//distance : 光源からの距離による減衰係数(float)
THREE.PointLight ( hex, intensity, distance )

スポットライト

一点に向けて光を当てる光源。その名の通りスポットライトのような感じ。 スポットライトによる影ができる。

//hex:光の色(16進数) ,
//intensity:光の強さ(float) , 
//distance : 光源からの距離による減衰係数(float), 
//angle: 照らす範囲角の半分(単位はラジアンでMath.PI/2を越えないように), 
//exponent:指数関数的な減衰係数(多くすると中心から外側に向かってすぐ暗くなる)
THREE.SpotLight ( hex, intensity, distance, angle, exponent )
   

ライトとマテリアルの関係

ライトを使用する場合はシェイプ側のマテリアルの設定にも注意が必要です。 マテリアルの中にはライトを受ける(反射できる)ことができるタイプとできないタイプがあります。

まとめ

上手くライトの描画の違いを表現できませんでした。 マテリアルとの相性とかもあるのかもしれません。

参考

Three.jsの基本⑤

UnityのRigidbodyの使い方の基礎の基礎

Unityは3Dゲーム開発用のエンジンなので、物理演算のコンポーネント(Rigidbody)が用意されています。 自分用のメモとして学んだことをまとめたいと思います。

Rigidbody

Rigidbodyとはオブジェクトに物理演算を適用するためのコンポーネントです。

スリープ

物理演算処理は負荷が高い処理の為、「速度が小さい値」になった(動かないと判定された)オブジェクトは、スリープ状態(演算の対象外)になります。

プロジェクトの初期設定で閾値(速度が小さい値)は 0.005 に設定されています。 この値を下回るとスリープ状態になります。

Edit > Project Setting > Physicsから設定を確認できます。

Physics Managerの設定内容

プロパティ 内容
Gravity 重力速度
Sleep Threshold スリープの閾値
Default Contact Offset 衝突判定の距離

詳しくは公式リファレンスを参考

ちなみにC#でGravityの値を変更する場合は、Physics.gravitynew Vector3(x, y, z);の値を渡します。

Physics.gravity = new Vector3(1,1,1);

Rigidbodyのプロパティ設定

プロパティ 内容
Mass 物体の重さ
Drag 空気抵抗。値が大きいとすぐ止まる
Angular Drag 回転に対する空気抵抗。値を大きくすると回転が止まりやすくなる。0だと回り続ける
Use Gravity 重力のオンオフ
is Kinematic 物理エンジンによるpositionの変更のオンオフ
Interpolate 物理効果をスムーズにする
Constraints 物理的な制約を設定。チェックを入れると、動かなくしたり回転しないようにできる

物理演算とよく一緒に使われるPhysic Material

Physic Materialは、見た目ではなく物体の物理的な材質を表現します。 具体的に言うと、摩擦や反発の設定ができます。

Assets > Create > Physic Materialから作成できます。

プロパティ 内容
Dynamic 移動している物体に対する摩擦。0の場合摩擦がなくな氷の上のような感じになる
Static Friction 静止している物体に対する摩擦。0の場合摩擦がなくな氷の上のような感じになる
Bounciness 反発の大きさ。1を設定した場合、反発しても勢いが弱まりません
Friction Combine 衝突するオブジェクトの摩擦の処理方法
Bounce Combine 衝突するオブジェクトの反発の処理方法

コリジョン(Sphere Collider)をイベント検知用のトリガーとして使う

通常コリジョン(Sphere Collider)は物理演算の為に使用しますが、イベントの検知用としても使うことができます。

Sphere ColliderはComponent > Physic > Sphere Colliderで追加できます。

Sphere ColliderのisTriggerにチェックを入れることで、他のオブジェクトと衝突しても物理演算が起こらないようになります。

まとめ

物理演算を使うための基礎でした。 複雑な計算をしなくても、物理演算ができるなんてなんて素敵な機能でしょう。

Unityの基礎の基礎操作

Unityの基礎の基礎操作です。自分用のメモの為に書きました。

基本ショートカット

a.png

Sceneビューの操作

操作 内容
平行移動 option + commandを押しながらクリック&ドラック
回転 optionをおしながらクリック&ドラック
回転  optionをおしながらクリック&ドラック
ズーム マウスのスクロールホイール操作
トラックパッドの2点スワイプ
フォーカス オブジェクトを選択後、shift + Fキー

透視投影と平行投影の切り替え

赤で囲った箇所をクリックで透視投影(パースのかかる状態)と平行投影(パースのかからない状態)を切り替える。

透視投影をPerspectiveモード、平行投影をIsometricモードとよぶ。

現在の視点にカメラを揃える

Sceneで表示中の視点にカメラの位置を揃えることができます。

カメラを選択した状態で、[GameObject > Align With View]

オブジェクトに(簡単に)物理属性を追加

  1. Add Componentから[Physics > Rigidbody]
  2. Projectから[create > Physics Material]を選択してオブジェクトに設定

Rigidbodyのプロパティ設定

プロパティ 内容
Mass 物体の重さ
Drag 空気抵抗。値が大きいとすぐ止まる
Angular Drag 回転に対する空気抵抗。値を大きくすると回転が止まりやすくなる。0だと回り続ける
Use Gravity 重力のオンオフ
is Kinematic 物理エンジンによるpositionの変更のオンオフ
Interpolate 物理効果をスムーズにする
Constraints 物理的な制約を設定。チェックを入れると、動かなくしたり回転しないようにできる

単位

太いグリッドが

マテリアル設定

Shader

オブジェクトの質感設定を行うのがShader(シェーダー)です。 物質によって、光の反射や吸収の仕方が違います。それを計算してくれるのがシェーダーです。

Standardシェーダー

物理現象を忠実にシュミレートしてくれるシェーダーです。 リアルな表現に適しています。

プロパティ 内容
Metallic 値が高いと金属らしくなり、値が低いと土や石のようになる
Smoothness 表面のなめらかさ
Emission マテリアル自身の発光の値。発光色も設定できる

SQL基礎の基礎の基礎〜WHERE句での絞込〜

SELECT文ではほとんどのケースでWHERE句を使用します。 つまり WHERE句が使えなければ、SELECT文は使えないことになるので、 まとめてみたいと思います。

WHERE句での絞込

WHEREは処理の対象を絞り込む場合に使用します。 SQLの修飾語のなかで1番利用するのがWHEREです。

WHERE句の基本

  • SELECT、UPDATE、DELETE文で使用する。INSERTでは使用できない
  • WHEREの後ろに条件式を記述する
  • SELECT、UPDATE、DELETE文でWHEREを指定しない場合は全ての行が対象になる
SELECT 列名,列名,...
FROM テーブル名
WHERE 条件式

条件式の基本構文

条件式に使える比較演算子です。

比較演算子 意味
= 左右の値が等しい
< 左は右より小さい
> 左は右より大きい
<= 左は右の値以下
>= 左は右の値以上
<> 左右の値が等しくない
!= 左右の値が等しくない

NULLの判定

NULLの判定に上記の比較演算子は使用できない。

IS NULL(値はNULL)、もしくはIS NOT NULL(値はNULLではない)を使用する。

SELECT *
FROM user
WHERE name IS NULL

LIKEで部分一致の絞込

LIKE演算子を使用すると、文字列を部分一致で検索することができます。 部分一致で検索する場合は、パターン文字列を使用します。

SELECT 列名
FROM テーブル名
WHERE 列名 LIKE パターン文字列

パターン文字列

パターン文字列 意味
% 任意の0文字以上の文字列
_ 任意の1文字
SELECT name
FROM user
WHERE name LIKE '%SATO%' 
  • %sato%の場合はhogeSATOhogeのように「前後」に0文字以上のも文字列がついてても検索される
  • %satoの場合はhogeSATOのように「前」に0文字以上のも文字列がついてても検索される

パターン文字列のエスケープ

もし検索対象にパターン文字列がある場合は、エスケープ句を使用します。

「りんご100%」の文字列の「%」をエスケープします。

SELECT name
FROM drink
WHERE name LIKE '%りんご100$%'  ESCAPE '$'

BETWEEN演算子で範囲を指定する

BETWEEN演算子は英語と同じで、「BETWEEN 値A AND 値B」「値Aと値Bの間」のような範囲指定をすることができます。

SELECT 列名,列名,...
FROM テーブル名
WHERE 列名 BETWEEN  値1 AND 値2

10才以上 〜 20才以下の範囲を検索する場合

SELECT *
FROM user
WHERE age BETWEEN  10 AND 20

IN演算子で複数の値と比較

IN演算子は任意の複数の値と比較することができます。

SELECT 列名,列名,...
FROM テーブル名
WHERE 列名 IN (値1,値2,...)

名前がsato、もしくはsuzukiで検索する

SELECT *
FROM user
WHERE name IN ('sato','suzuki')

NOT INにすると、比較に合致しない値を検索します。

ANY/ALL演算子で複数の値と比較

IN演算子はリストの複数の値と比較して、1つでも合致するものがあればtrueを返しました。 単体で利用することはあまりないですが、複数の値を大小比較する場合に使用します。

ANY

ANYは値の大小を比較して1つでも真のものがあればtrueを返します。

SELECT *
FROM user
WHERE age < ANY (10,11)
ALL

ANYは値の大小を比較して全て真であればtrueを返します。

SELECT *
FROM user
WHERE age < ALL (10,11)

SQLの基礎の基礎の基礎

基礎の基礎の基礎ですが、SQL分の4大命令について自分のメモ用にまとめたいと思います。

SQLの4大命令

命令 命令文詳細 絞込 検索 タイプ
SELECT 列名 FROM テーブル名 テーブル検索系
UPDATE テーブル名 SET 列名=値 テーブル更新系
DELETE FROM テーブル名 テーブル更新系
INSERT INTO テーブル名(列名)VALUES (値) テーブル更新系

SELECT

テーブルから目的のデータを取得する。

基本構文

SELECT 列名 ・・・ ①
FROM   テーブル名・・・ ②

① 取得したいテーブルの列名。複数の列を指定する場合はカンマで区切る。 アスタリスクを指定すると全ての列を指定できるが、パフォーマンス上問題になる場合があるのであまり使用しない。

② データを取得するテーブルを指定

例)userテーブルからnameとemailの情報を取得する
SELECT name,enail
FROM user

UPDATE

既にあるテーブルのデータを更新する。

基本構文

UPDATE テーブル名               ・・・   ①
SET 列名1 = 値1,列名2 = 値2,... ・・・  ②
WHERE 条件                     ・・・   ③

① データを更新するテーブルを指定。

② 更新したい列名と、その列に書き込むデータ

③UPDATEは「WHERE」を使って更新条件を指定するケースがほとんどです。 WHEREを使用しない場合は指定した列の全てのデータが書き換わってしまいます。

例)userテーブルのnameとemailの情報更新する
UPDATE user
SET name ='sato' ,email = 'sample@gmail.com'
WHERE date ='2017-05-10'

DELETE

テーブルの行を削除。 特定の列だけを削除することはできません。

基本構文

DELETE 
FROM テーブル名 ・・・ ①
WHERE 条件     ・・・ ②

① データを削除するテーブルを指定。

② DELETEは「WHERE」を使って削除条件を指定するケースがほとんどです。 WHEREを使用しない場合は指定したテーブルの全てのデータが削除されてしまいます。

例)userテーブルのnameが'sato'の列を削除
DELETE 
FROM user
WHERE name ='sato'

INSERT

テーブルに新しいデータを追加する。

基本構文

INSERT INTO  テーブル名         ・・・ ①
             (列名1,列名2,...) ・・・ ②
VALUES       (値1,値2,値3)    ・・・ ③

① データを挿入するテーブルを指定

② 追加する列名。追加する列名は省略することができる。省略した場合は③の値はテーブルの列の順番と対応させる必要がある。

③ 追加する値

例)userテーブルにname:suzuki、email:suzuki@gmail.comを追加
INSERT INTO user
            (name,email)
VALUES      ('suzuki','suzuki@gmail.com')