3dcg(18)
anime(1)
bash(1)
bcb(4)
boost(3)
bullet(1)
c++(44)
component(1)
c言語(1)
debian(2)
delphi(6)
doc(1)
emacs(16)
etc(3)
execute(1)
gdb(1)
glut(7)
ibds(1)
index(2)
info(1)
java(1)
link(5)
linux(22)
lisp(1)
math3d(10)
matrix(1)
newton(1)
nvidia(1)
opengl(24)
povray(1)
preprocessor(1)
raytracing(4)
sample(4)
stl(2)
think(1)
vc(1)
vmware(1)
win32(1)
windows(1)
wm(1)
xyzzy(4)
ぃぬx(1)
タグ検索で3dcgは18件見つかりました。
Normal3DCG
*法線
法線を出すには、
1.三角形の3つの頂点から、その三角形の2つの辺をベクトルとして出す。
2.その2つの辺を外積して、1つの方向ベクトルを出す。
3.そのままでは計算に使えないので、各要素の合計が1になるベクトルに
変換する(正規化)。
という手順になります。
法線の計算では、ゼロによる除算に気を付けてください。(他の場合でもそうですが)
軸に水平なポリゴンの面などの場合、まれにゼロで割るケースが
発生しますので、防止用のコードを書いておきましょう。
面を構成するa,b,c3つの点は時計回
https://seesaawiki.jp/w/eruvasu/d/Normal3DCG... - 2008年03月07日更新
dot3DCG
https://seesaawiki.jp/w/eruvasu/d/Normal3DCG... - 2008年03月07日更新
*内積の計算
内積は2つのベクトルのX,Y,Z 同士を、それぞれ掛けてから合計した小数です。
''&color(#1E90FF){内積 = a.x * b.x + a.y * b.y + a.z * b.z;}''
また、
|A||B|cos角度
でも表します。
***C++
float dot(TVector &a, TVector &b)
{
return a.v[0] * b.v[0] + a.v[1] * b.v[1] + a.v[2] * b.v[2];
};
***J
https://seesaawiki.jp/w/eruvasu/d/dot3DCG... - 2008年02月23日更新
Plate
https://seesaawiki.jp/w/eruvasu/d/dot3DCG... - 2008年02月23日更新
*平面方程式
平面方程式は平面上の中のある一点と法線の内積で表せます
''&color(#1E90FF){d = 内積( 点, 法線 );}''
d = dot(p, n);
***C++
平面方程式用のクラス
class TPlane
{
public:
TVector n;
float d;
};
TPlane makePlane(TVector &a, TVector &b, TVector &c)//3つの点は時計回り
{
TPlane ret;
ret.n = normal(a,
https://seesaawiki.jp/w/eruvasu/d/Plate... - 2008年02月18日更新
distancePlaneToPoint
https://seesaawiki.jp/w/eruvasu/d/Plate... - 2008年02月18日更新
*無限平面と点の距離
3D空間上のある無限平面とある点Qの距離を出すには、
''&color(#1E90FF){距離 = 内積( 平面の法線、Q点座標 ) − 平面方程式のd;}''
(注:平面の法線は正規化されてる必要がある)
どうしてこのようになるかと言うと
まず、点Qの平面上の最接近点Rがあると考えます。
また平面上のどこかに点Pがあり、法線Nとdはわかっているとします。
このRは
点Qから、法線Nと面からQまでの距離tを掛けたベクトルを引くことによって得られます。
(方向としてのN
https://seesaawiki.jp/w/eruvasu/d/distancePlaneToP... - 2008年02月18日更新
normalize
https://seesaawiki.jp/w/eruvasu/d/distancePlaneToP... - 2008年02月18日更新
*単位ベクトル化(正規化)
ベクトルをX,Y,Zの各成分が合計1となるように、それぞれの割合を
設定したものを単位ベクトルと呼びます。
各成分がそれぞれの割合を示しているので、この状態のものは
ベクトルの計算に使いやすいのです。
ベクトルvの単位ベクトルを求めるには
''&color(#1E90FF){単位ベクトル = v * ( 1 / ベクトルvの大きさ );}''
***C++
TVector normalize(TVector &a)
{
float mag = magnitude(
https://seesaawiki.jp/w/eruvasu/d/normalize... - 2008年02月18日更新
VectorLength
https://seesaawiki.jp/w/eruvasu/d/normalize... - 2008年02月18日更新
*ベクトルの長さ
ベクトルの長さ(大きさ)を一つのスカラー(小数)で表します。
X,Y,Zのそれぞれの成分の2乗を合計してから、平方根を出します。
正規化などで利用できます。
''&color(#1E90FF){長さ = sqrt( x * x + y * y + z * z );}''
***C++
float magnitude(TVector &a)
{
return sqrt(a.v[0] * a.v[0] + a.v[1] * a.v[1] + a.v[2] * a.v[2]);
};
https://seesaawiki.jp/w/eruvasu/d/VectorLength... - 2008年02月18日更新
cross3dcg
https://seesaawiki.jp/w/eruvasu/d/VectorLength... - 2008年02月18日更新
*外積の計算
外積は、2つのベクトルを
''x = y * z - z * y;''
''y = z * x - x * z;''
''z = x * y - y * x;''
順で計算します。
***C++
TVector cross(TVector &a, TVector &b)
{
TVector ret;
ret.v[0] = a.v[1] * b.v[2] - a.v[2] * b.v[1];
ret.v[1] = a.v[2] * b.v[0] - a.v[0] * b.v[2];
https://seesaawiki.jp/w/eruvasu/d/cross3dcg... - 2008年02月18日更新
ScreenToWorld
https://seesaawiki.jp/w/eruvasu/d/cross3dcg... - 2008年02月18日更新
function ScreenToWorld(ScreenX, ScreenY, ScreenZ : Single) : TVector3f;
var
Viewport : TViewPortArray;
MVMat : T16dArray;
PJMat : T16dArray;
WinX : Double;
WinY : Double;
WinZ : Double;
ObjX : Double;
ObjY : Double;
ObjZ : Do
https://seesaawiki.jp/w/eruvasu/d/ScreenToWorld... - 2008年01月20日更新
AmbientLight3DCG
https://seesaawiki.jp/w/eruvasu/d/ScreenToWorld... - 2008年01月20日更新
*環境光を入れる
環境光を入れ、三角形のクラス(Tri)を描くようにしました。
環境光の計算は、
color.x * lw
とdiffuseの値を出してから、ambを足して
amb.x + color.x * lw
255を掛けます。
(amb.x + color.x * lw) * 255
Vertex amb = new Vertex(0.2f, 0.2f, 0.2f);
void drawTriangle(Tri tri, int[] pix, Vertex lightDir,
https://seesaawiki.jp/w/eruvasu/d/AmbientLight3DCG... - 2008年01月07日更新
DiffuseLight3DCG
https://seesaawiki.jp/w/eruvasu/d/AmbientLight3DCG... - 2008年01月07日更新
*照明下での面の色(diffuse)を決める
ライトがある時の面の色は、面の設定色 * (面の法線とライトの向きの内積) で計算します。
まず、面の法線を出します。destに法線が入ります。
Vertex dest = new Vertex();
m3.normal(dest, v1, v2, v3);
ライトの向きとの内積を出します。
float lw = m3.dot(dest,lightDir);
もともとの設定色にlwと255を掛けると、色が決まります。
int r = (int)(color
https://seesaawiki.jp/w/eruvasu/d/DiffuseLight3DCG... - 2008年01月07日更新
Matrix3DCG
https://seesaawiki.jp/w/eruvasu/d/DiffuseLight3DCG... - 2008年01月07日更新
*行列計算クラス
行列によるアフィン変換は、行列の掛け算が
基本にあります。横掛ける縦の順で掛けて行きます。
public class Matrix {
float a0, a1, a2, a3;
float b0, b1, b2, b3;
float c0, c1, c2, c3;
float d0, d1, d2, d3;
Matrix t = null;
Matrix()
{
loadIdentity();
}
void tmpInit()
{
if (t == null)
https://seesaawiki.jp/w/eruvasu/d/Matrix3DCG... - 2008年01月07日更新
Triangle_3DCG
https://seesaawiki.jp/w/eruvasu/d/Matrix3DCG... - 2008年01月07日更新
*三角形の描き方
三角形を二次元配列上に描くには、三角形の縦を基準にして考えたとき、
ある高さ(Y値)の時は、横幅(X値)はどこからどこまでが分かれば
その横幅を線として描いて、三角形にできます。
まず、高さの下から上までをループを作ります。(low_yを三角形の一番下、top_yを
一番上とします。)
for (int i = low_y; i v1y) low_y = v1y;
if (low_y > v2y) low_y = v2y;
if (low_y > v3y) low_y
https://seesaawiki.jp/w/eruvasu/d/Triangle%5f3DCG... - 2008年01月07日更新
BrezLine
https://seesaawiki.jp/w/eruvasu/d/Triangle%5f3DCG... - 2008年01月07日更新
*直線の書き方2
大きな数を掛けて、整数で足し算をしていきます。
割合は縦を基準に計算します。
int[] tateArr;
void calcLineTate(int p1x, int p1y, int p2x, int p2y)
{
int x16_x1 = p1x > 16] = tmp_x >> 16;
}
}
void drawLineTate(Vertex p1, Vertex p2, int[] pix)
{
tateArr = new int[hei]
https://seesaawiki.jp/w/eruvasu/d/BrezLine... - 2008年01月07日更新
LINE_3DCG
https://seesaawiki.jp/w/eruvasu/d/BrezLine... - 2008年01月07日更新
*直線の書き方
2次元配列上に、直線を直接描く方法について説明します。
基本的には、長い辺で短い辺を割り、短い辺の割合をだします。
その割合を長い辺がカウントされる度に足していき、
1を超えると短い辺が一つ増える、というアルゴリズムです。
以下にJavaでコードを書いて見ます。
無論、いろいろな書き方があり、次の書き方はその一つでしかありません。
また、最適化もされていません。
void drawLine(Vertex p1, Vertex p2)
{
if (p1.y tate_no_nagas
https://seesaawiki.jp/w/eruvasu/d/LINE%5f3DCG... - 2008年01月07日更新
MatrixBasic1
https://seesaawiki.jp/w/eruvasu/d/LINE%5f3DCG... - 2008年01月07日更新
**行列計算クラス C++
行列によるアフィン変換は、行列の掛け算が
基本にあります。横掛ける縦の順で掛けて行きます。
class TMatrix
{
float a0, a1, a2, a3;
float b0, b1, b2, b3;
float c0, c1, c2, c3;
float d0, d1, d2, d3;
public:
TMatrix()
{
loadIdentity();
}
void loadIdentity()
{
a0 = a1
https://seesaawiki.jp/w/eruvasu/d/MatrixBasic1... - 2007年12月26日更新
DrawTriangle
https://seesaawiki.jp/w/eruvasu/d/MatrixBasic1... - 2007年12月26日更新
**三角形の描き方
三角形を二次元配列上に描くには、三角形の縦を基準にして考えたとき、
ある高さ(Y値)の時は、横幅(X値)はどこからどこまでが分かれば
その横幅を線として描いて、三角形にできます。
まず、高さの下から上までをループを作ります。(low_yを三角形の一番下、top_yを
一番上とします。)
for (int i = low_y; i v1y) low_y = v1y;
if (low_y > v2y) low_y = v2y;
if (low_y > v3y) lo
https://seesaawiki.jp/w/eruvasu/d/DrawTriangle... - 2007年12月24日更新
DrawLine2
https://seesaawiki.jp/w/eruvasu/d/DrawTriangle... - 2007年12月24日更新
**直線の書き方2
大きな数を掛けて、整数で足し算をしていきます。
割合は縦を基準に計算します。
int[] tateArr;
void calcLineTate(int p1x, int p1y, int p2x, int p2y)
{
int x16_x1 = p1x > 16] = tmp_x >> 16;
}
}
void drawLineTate(Vertex p1, Vertex p2, int[] pix)
{
tateArr = new int[hei
https://seesaawiki.jp/w/eruvasu/d/DrawLine2... - 2007年12月24日更新
DrawLine
https://seesaawiki.jp/w/eruvasu/d/DrawLine2... - 2007年12月24日更新
*直線の書き方
2次元配列上に、直線を直接描く方法について説明します。
基本的には、長い辺で短い辺を割り、短い辺の割合をだします。
その割合を長い辺がカウントされる度に足していき、
1を超えると短い辺が一つ増える、というアルゴリズムです。
以下にJavaでコードを書いて見ます。
無論、いろいろな書き方があり、次の書き方はその一つでしかありません。
また、最適化もされていません。
void drawLine(Vertex p1, Vertex p2)
{
if (p1.y tate_no_nag
https://seesaawiki.jp/w/eruvasu/d/DrawLine... - 2007年12月24日更新
https://seesaawiki.jp/w/eruvasu/d/DrawLine... - 2007年12月24日更新