前回のあらすじは,
遠近法と焦点距離
第33回
視野角に関わる大きさとして
3次元空間のオブジェクトと2次元平面に投影された像との大きさの比率を求めよう。視点を頂点とし,
投影像の大きさ/オブジェクトの大きさ = 焦点距離 / (焦点距離 + z位置)
投影像の大きさ = オブジェクトの大きさ×焦点距離 / (焦点距離 + z位置)
この比例式は,
このように3次元空間の座標を2次元平面のxy座標に変換するとき,
3次元空間の座標を2次元平面に透視投影する比率
焦点距離 / (焦点距離 + z位置)
- ※1
- 視野角が0から180度までなのに対して,
焦点距離は無限大から0までの極めて幅広い値をとる。視野角と焦点距離の値には, つぎのグラフのような関係がある (図3)。
焦点距離にもとづく透視投影の計算
3次元空間座標を2次元平面に透視投影するには,
前述第33回
それでは,
function xGetVertices2D(myVertices:Vector.<Vector3D>):Vector.<Point > {
var vertices2D:Vector.<Point> = new Vector.<Point>();
var nLength:uint = myVertices.length;
for (var i:uint = 0; i < nLength; i++) {
var myVector3D:Vector3D = myVertices[i];
// 透視投影の処理を加える
vertices2D.push(new Point(myVector3D.x, myVector3D.y));
}
return vertices2D;
}
焦点距離は,
var nFocalLength:Number = transform.perspectiveProjection.focalLength; // 追加
function xGetVertices2D(myVertices:Vector.<Vector3D>):Vector.<Point > {
var vertices2D:Vector.<Point> = new Vector.<Point>();
var nLength:uint = myVertices.length;
for (var i:uint = 0; i < nLength; i++) {
var myVector3D:Vector3D = myVertices[i];
var nProjectionRatio:Number =
nFocalLength / (nFocalLength + myVector3D.z); // 追加
vertices2D.push(new Point(myVector3D.x * nProjectionRatio,
myVector3D.y * nProjectionRatio)); // 修正
}
return vertices2D;
}
この関数の書替えで,