본문 바로가기

Workshop Index

Vector

Numerical representation of vectors

 

 


Length

double length = Math.Sqrt(v.x * v.x + v.y * v.y + v.z * v.z);

 

Multiplication by a number(scalar)

double scalar = 2.5;

Vector v1 = new Vector( v0.x * scalar , v0.y * scalar , v0.z * scalar);

 


Vectors as differences of Points

double distance = Math.Sqrt(
    (p0.x - p1.x) * (p0.x - p1.x) + (p0.y - p1.y) * (p0.y - p1.y) + (p0.z - p1.z) * (p0.z - p1.z)
);

 

Unit Vectors

double len = Math.Sqrt(v.x * v.x + v.y * v.y + v.z * v.z);

Vector unitV = new Vector(v.x / len , v.y / len , v.z / len);

 


 

Addition of Vectors

Vector resultV = new Vector( v0.x + v1.x , v0.y + v1.y , v0.z + v1.z);

 

 

Subtraction of Vectors

Vector resultV = new Vector( v0.x - v1.x , v0.y - v1.y , v0.z - v1.z);

 


Dot Product


double 
dotProduct v0.x * v1.x + v0.y * v1.y + v0.z * v1.z;


Cross Product

Vector normalV = Vector(
    v0.y * v1.z - v0.z * v1.y ,
    v0.z * v1.x - v0.x * v1.z ,
    v0.x * v1.y - v0.y * v1.x
);

 


 

Angle between vectors

double angle = Math.Acos(
    (v0 * v1) / ( v0.length() * v1.length() )
);

 

Angle of triangle

Vector v0 = p1-p0;
Vector 
v1 = p2-p0;
double angle = Math.Acos(
    v0 * v1) / (v0.length() * v1.length())
);

 

Area of triangle

Vector v0 = p1 - p0;
Vector 
v1 = p2 - p0;
Vector 
cv = crossProduct(v0, v1);
double area = cv.length() * 0.5;

 

Triangle unit normal vector

Vector v0 = p1 - p0;
Vector 
v1 = p2 - p0;
Vector normalV = crossProduct (
v0 , v1);
normalV.normalized();


Projection of a point to a line

Vector v0 = p1 - p0;
Vector 
v1 = tP - p0; v0.normalized();
projectedPt = 
v0 + v0 * (v1 * v0);

 



Mid-point

Point midPoint = (p1 + p2) * 0.5;



Center of triangle

 

Point midPoint = ( p1 + p2 + p3 ) * ( 1.0 / 3.0) ;

 

Center of point cloud

Point midPoint = new Point();
for(int i=0; i < pt.Length; ++i) {
    pmean += pt[i]; // 모든 포인트의 위치를 더한다.

}

midPoint *= ( 1.0 / (pt.Length) );


Raytracer

Raytracer Scene


The basic operation of Vectors


Division of Vectors


 


 


Common Geometric problems

Distance between two vectors

 

Vector at t

Angle Between Vectors

Angle of Triangle 

 

Area of Triangle

Triangle Unit normal

Projection of point to line

Projection of Point to plane

Point at a distance d along the line between two vectors


Linear interpolation between two vectors

Center of triangle

Center of point cloud

 

 

 


 

질문:

 

R(Real Numbers) 1은 1차원 월드 공간 좌표계로, 점을 선상에서 나타내 주는 거죠, 그리고 점을 모으면 선이 되겠죠.

R22차원 좌표계로, 점을 2차원 공간상에 점을 찍어 주는 것이죠.

R33차원 좌표계로. 축에 3개인 공간에서 점을 표현하는 것이죠.

 

지오메트리는 결국 벡터(포인트)로 분해가 가능하니, 포인트를 R1 R2 R3 스페이스 각각의 좌표계 해석이 가능하겠죠.

 

일반적으로, 라인에서 포인트를 추출할 때는, 라인을 R1으로 해석해서, T 값을 가지고 라인상의 지점을 포인트(xyz)로 추출할 수 있어요.

 

면에서 포인트를 추출할 때, 면은, R2 공간 좌표계로 해석이 가능하기 때문에, U, V 값을 가지고 표면상의 지점을 포인트(xyz)로 추출할 수 있어요

 

우리가 흔히 쓰는 CAD 시스템의 3차원 공간 좌표계에의 어떤 포인트의 위치를 R3좌표계 즉 xyz의 값으로 공간상에 새로운 포인트(xyz)로 바로 사용하여, 추출할 수 있겠죠.

 

프로젝션의 개념으로 하나의 벡터가(포인트) 다양한 공간 좌표계로 투영하여 해석이 가능한 개념이에요.

 

다음의 이미지도 보면, 하나의 점이 3개의 공간으로 해석되는 예이고, 이것은 디자인 스크립팅을 하다 보면, 알고리즘을 만들다 보면, 선과 면 그리고 3차원 공간상에서 특정 지점들의 위치를 다른 좌표계로 투영하는 일은 매우 빈번이 발생해요.

https://developer.rhino3d.com/images/primer-rhinospaces.svg

 

질문을 다시 상기해보면,

 

..........................................................

질문 1 “점은 R3값만 존재하고

 

답변:  점은, 좌표계에 따라, R1 공간일 경우에는 하나의 값(t)만 있으면 되고

R2공간은 두 개의 값(u, v) R3공간은 세 개의 값(xyz)이 있어야 표현이 가능하죠

 

..........................................................

질문 2 선은 R1(길이)과 R3값만 존재하고

 

답변: R1t 값만 존재하는 좌표계이죠. 그런데 라이노 API에서는 이 t 값을 R3값으로 프로젝션 해주는 함수가 있죠 이것을 활용하면, R1 공간으로 해석이 가능한, 즉 라인의 특점 한 포인트(t)를(t)을 R3 공간의 포인트(xyz)로 환산할 수 있는 것이죠. 반대로도 가능하고요..

 

..........................................................

면은 R2(uv)와 R3값만 존재한다고 생각하면 될까요?

 

답변: 위의 질문과 같게, R2로 좌표계의 공간은 즉 면이죠. 면 상에서 어떠한 지점을 기술하면, UV로 설명할 수 있죠. UVR3 월드 좌표계로 투영하면 그 지점은(UV) 같은 R3의 지점으로(XYZ)로 환산된다는 것이죠. 이것도 반대로도 가능하고요.

 

 

다음의 비디오의 다음의 초에, t-value 그리고 FrameAT이 그것과 관련된 내용일 것 같아요. 자세히 기억은 안 나는데 이것도 참조해 보세요.

 

https://youtu.be/52bidZar5Xg

32:07 - Curve, Tangent, t-Value, Reparameterize, Vector Display

54:19 - Frame At