12월 22일 오후4시 대명동계대 진흥원 본관 6층에서 진행합니다.
관심있으신 분들은 많은 참가 바랍니다.
12월 22일 오후4시 대명동계대 진흥원 본관 6층에서 진행합니다.
관심있으신 분들은 많은 참가 바랍니다.
2015 대구게임아카데미 13기 수강생 모집
현재 추가 모집중입니다.
수강및 게임제작에 관심있으신 분은 아래 링크를 참고해 주세요.
http://dggame.or.kr/AlbBoard/view.php?bcode=notice&seq=57
대구게임아카데미 12기 프로젝트 C조 CubeIsland (0) | 2015.02.26 |
---|---|
대구게임아카데미 12기 프로젝트 B조 LostSeason (0) | 2015.02.26 |
대구게임아카데미 12기 프로젝트 A조 Messiah (0) | 2015.02.26 |
대구게임아카데미 10기 프로젝트 C조 (0) | 2014.02.17 |
대구게임아카데미 10기 프로젝트 B조 (0) | 2014.02.17 |
자바스크립트의 var와같은 자료형을 정하지않고 쓸수있다.
단 C++에서는 한번정해진 자료형은 변경은 불가능하다.
따라서 선언과 동시에 초기화가 되어야된다.
또한 자료형은 컴파일 타임에 정해지게 된다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | int main() { // 상수대입가능, 해당 상수의 자료형으로 정해진다. auto a = 1; // 변수대입가능, 해당 변수의 자료형으로 정해진다. int i = 5; auto b = i; // 주소값 대입가능, 해당 변수의 포인터자료형으로 정해진다. auto c = &i; int* p = &i; auto d= p; // 레퍼런스 대입가능, 레퍼런스는 auto뒤에 &를 붙여야 한다. auto& e = i; return 0; } | cs |
위처럼 단순대입으로 사용할 일은 거의 없을것이다.
아마도 유용하게 사용될때가 STL을 사용할 때 일것이다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | #include <vector> int main() { std::vector<int> vecTmp; vecTmp.push_back(1); vecTmp.push_back(2); vecTmp.push_back(3); vecTmp.push_back(4); vecTmp.push_back(5); // 반복자를 사용 모든요소 출력 for (std::vector<int>::iterator iter = vecTmp.begin(); iter != vecTmp.end(); ++iter) { printf("%d \n", *iter); } } | cs |
위의 코드에서처럼 반복자(iterator)를 하나 쓸려면 적어야 할게 많다.
그래서 일반적으로 typedef를 많이 사용 했다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | #include <vector> typedef std::vector<int> VEC_INT; typedef VEC_INT::iterator VEC_INT_ITER; int main() { VEC_INT vecTmp; vecTmp.push_back(1); vecTmp.push_back(2); vecTmp.push_back(3); vecTmp.push_back(4); vecTmp.push_back(5); // 반복자를 사용 모든요소 출력 for (VEC_INT_ITER iter = vecTmp.begin(); iter != vecTmp.end(); ++iter) { printf("%d \n", *iter); } } | cs |
아까보단 일이 줄어들었지만 typedef를 작성하는것도 불편한점은 존재한다.
auto를 이용한다면
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | #include <vector> int main() { std::vector<int> vecTmp; vecTmp.push_back(1); vecTmp.push_back(2); vecTmp.push_back(3); vecTmp.push_back(4); vecTmp.push_back(5); // 반복자를 사용 모든요소 출력, auto 사용 for (auto iter = vecTmp.begin(); iter != vecTmp.end(); ++iter) { printf("%d \n", *iter); } } | cs |
std::vector<int>::iterator 대신에 auto를 쓰는것만으로 해결이 된다.
STL을 자주사용하는 사람들에겐 아주 유용하게 쓰일것으로 보인다.
auto를 쓰면 자료형을 알기가 어렵지 않냐고 할수 있지만 visual studio에서 해당변수의 실제 자료형을 친절히 알려주기 때문에 큰문제는 없다.
MSDN
기존 널포인터는 NULL을 사용했는데 일반적으로는 큰문제점이 없지만 실제적으로 #define NULL 0 으로 정의되어있었기 때문에 사실상 0이라는 정수형 이었다.
따라서 함수의 매겨변수로 NULL값자체를 넘긴다면 실제자료형은 int형으로 판단이 된다.
이런문제점들을 해결하기 위해 나온것이 nullptr 입니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | void function(int a) { printf("int \n"); } void function(int* a) { printf("int* \n"); } int main() { function(NULL); function(nullptr); return 0; } | cs |
결과값
int
int*
널포인터 형식을 좀더 명확하게 해주므로 NULL 대신에 nullptr을 사용하는것이 좋을것 같음.
MSDN
https://msdn.microsoft.com/ko-kr/library/4ex65770.aspx
2015 대구게임아카데미 13기 수강생 모집 (0) | 2015.04.13 |
---|---|
대구게임아카데미 12기 프로젝트 B조 LostSeason (0) | 2015.02.26 |
대구게임아카데미 12기 프로젝트 A조 Messiah (0) | 2015.02.26 |
대구게임아카데미 10기 프로젝트 C조 (0) | 2014.02.17 |
대구게임아카데미 10기 프로젝트 B조 (0) | 2014.02.17 |
2015 대구게임아카데미 13기 수강생 모집 (0) | 2015.04.13 |
---|---|
대구게임아카데미 12기 프로젝트 C조 CubeIsland (0) | 2015.02.26 |
대구게임아카데미 12기 프로젝트 A조 Messiah (0) | 2015.02.26 |
대구게임아카데미 10기 프로젝트 C조 (0) | 2014.02.17 |
대구게임아카데미 10기 프로젝트 B조 (0) | 2014.02.17 |
대구게임아카데미 12기 프로젝트 C조 CubeIsland (0) | 2015.02.26 |
---|---|
대구게임아카데미 12기 프로젝트 B조 LostSeason (0) | 2015.02.26 |
대구게임아카데미 10기 프로젝트 C조 (0) | 2014.02.17 |
대구게임아카데미 10기 프로젝트 B조 (0) | 2014.02.17 |
대구게임아카데미 10기 프로젝트 A조 (0) | 2014.02.17 |
임의의 두 다면체에 대해 어떤 축이 존재해서 그 축으로 다면체를 투영할시 투영 구간이 겹치지 않는다면 서로 겹치지 않는다.
A와 B가 겹치지 않는다면 다음 축들 중 하나에 평행한 축에 의해 분리된다.
1. A면중 하나의 법선 벡터
2. B면중 하나의 법선 벡터
3. A의 변과 C의 변에 동시에 수직인축
axis1의 경우 두물체를 투영시 투영부분이 겹치지만 axis2에서 겹치지 않으므로 두물체는 서로 겹치지 않는다.
구 vs 캡슐 교차 (0) | 2014.10.27 |
---|---|
구 vs OBB (0) | 2014.10.27 |
광선 vs 캡슐 교차검출 (0) | 2014.10.27 |
광선 vs OBB 교차검출 (0) | 2014.10.27 |
AABB와 OBB (0) | 2014.10.27 |
구의 중점과 캡슐의 선분의 최단거리가 구의반지름 + 캡슐반지름 보다 작거나 같다면 교차
※ 선분과 점의 최단거리 구하는 방법 참조
SAT (Separating Axis Theory, 분리축 이론) (0) | 2014.10.27 |
---|---|
구 vs OBB (0) | 2014.10.27 |
광선 vs 캡슐 교차검출 (0) | 2014.10.27 |
광선 vs OBB 교차검출 (0) | 2014.10.27 |
AABB와 OBB (0) | 2014.10.27 |
구의 중심과 OBB 사이의 가장 가까운점과의 거리가 구의 반지름보다 작거나 같다면 교차했다고 할 수 있다.
OBB와 점 사이의 가장 가까운 거리 찾기
C : 박스의 중심
a : 박스의 각축의 정규화된 벡터
r : 박스의 길이(절반길이)
P: 임의의점
P와 C를 잇는 벡터 d를 구한다.
각축을 t에 투영하여 거리를 구한다
이거리는 박스의 범위를 넘어가지 않게 제한한다
박스의 중심C와 각축에 대해 구한 거리벡터를 모두더한 값이 가장가까운점 p'가 된다
SAT (Separating Axis Theory, 분리축 이론) (0) | 2014.10.27 |
---|---|
구 vs 캡슐 교차 (0) | 2014.10.27 |
광선 vs 캡슐 교차검출 (0) | 2014.10.27 |
광선 vs OBB 교차검출 (0) | 2014.10.27 |
AABB와 OBB (0) | 2014.10.27 |
캡슐상의 선분과 광선의 최단거리가 캡슐의 반지름 보다 작다면 교차 했다고 할수 있다.
두광선을 캡슐과의 최단거리(초록색)을 살펴보면 1번광선은 최단거리가 캡슐 반지름보다작아 교차한다.
2번광선은 최단거리가 캡슐 반지름보다 커서 교차하지 않는다.
구 vs 캡슐 교차 (0) | 2014.10.27 |
---|---|
구 vs OBB (0) | 2014.10.27 |
광선 vs OBB 교차검출 (0) | 2014.10.27 |
AABB와 OBB (0) | 2014.10.27 |
광선 vs 구 교차판정 (0) | 2014.10.27 |
광선과 OBB의 교차검출 방법중에 slabs 방법이 있다.
광선과 육면체 세방향에 대한 교점을 찾고 교점의 최대값 최소값을 비교하면된다
구한 최소값중에서 가장큰값이 최대값중에서 가장작은값 보다 작거나 같다면 광선과 박스가 교차한 것 이다.
(1) 광선과 교점의 최소값중에서 가장큰값 (tu min)이 최대값중에서 가장작은값(tv max)보다 작다. (교차)
(2) 광선과 교점의 최소값중에서 가장큰값 (tv min)이 최대값중에서 가장작은값(tu max)보다 크다. (교차하지 않음)
광선과 면의 방향에따른 교점거리를 구하는 공식은 다음과 같다.
C : 박스의 중심
a : 박스의 각축의 정규화된 벡터
r : 박스의 길이(절반길이)
O: 광선의 시작점
v: 광선의 방향
한가지 고려해야될 상황은 광선과 박스의 면이 평행할때이다.
가 0이라면 광선과 해당면은 평행이다 여기에서
거나
이면
광선은 박스 밖에 있다는것 이므로 교차하지 않게된다.
구 vs OBB (0) | 2014.10.27 |
---|---|
광선 vs 캡슐 교차검출 (0) | 2014.10.27 |
AABB와 OBB (0) | 2014.10.27 |
광선 vs 구 교차판정 (0) | 2014.10.27 |
선분 선분 최단점과 최단거리 (1) | 2014.10.22 |
게임에서 사용하는 충돌 박스(직육면체)의 경우 두종류로 분류할 수 있다.
AABB (Axis Aligned Bounding Box)
축에 정렬된 직육면체
축에 정렬되어 있으므로 물체가 회전함에따라 경계를 다시 지정 해야한다
교차검출이 정밀하지 않다
교차검출이 간단하다
OBB (Object Oriented Bounding Box)
물체가 회전함에따라 같이 회전하게 된다
AABB보다 교차검출이 정밀하다
교차검출이 복잡하다
AABB와 OBB의 차이
AABB박스(초록색) OBB박스(붉은색)
AABB박스는 물체가 회전하더라도 축과정렬이되어 새롭게 범위가 지정된다.
OBB박스는 물체가 회전하면 같이 회전하게 된다.
광선 vs 캡슐 교차검출 (0) | 2014.10.27 |
---|---|
광선 vs OBB 교차검출 (0) | 2014.10.27 |
광선 vs 구 교차판정 (0) | 2014.10.27 |
선분 선분 최단점과 최단거리 (1) | 2014.10.22 |
선분 점 최단점과 최단거리 (0) | 2014.10.21 |
광선의 시작점을 o 방향을 d라 할때 광선의 수식
구의중심을 c 반지름r 구상의 임의의점을 p라 할떄 구의 수식
광선과 구의 교차를 구할려면 구의수식에서 p를 광선 r(t)로 변경하면 된다.
d를 단위 벡터라 가정하면
위 식은 2차 방정식 이므로 근의 공식으로 해를 구할 수 있다. (위 식에서 b가 짝수이므로 짝수공식을 사용하면 된다)
우리가 구한 식에서 짝수공식에 해당하는 a, b, c 는 다음과 같다.
해를 구하기 전에 판별식으로 해가 존재하는지를 확인해봐야 한다.
위 식들에의해 교차판정과 충돌지점을 구할 수 있다 .
연산의 최적화를 위해 몇가지 고려해 볼 만한사항이 있다.
1) 광선이 구 안에서 시작할 때 무조건 교차한다고 할 수 있다.
2) 구가 광선의 뒤쪽에 있을 때 교차 하지 않을 것이다.
s가 0보다 크고 광선의 시작점이 구 밖에 있을때 구는 광선 뒤쪽에 있다고 판단할 수 있다.
광선 vs OBB 교차검출 (0) | 2014.10.27 |
---|---|
AABB와 OBB (0) | 2014.10.27 |
선분 선분 최단점과 최단거리 (1) | 2014.10.22 |
선분 점 최단점과 최단거리 (0) | 2014.10.21 |
광선 점 최단점과 최단거리 (0) | 2014.10.20 |
3차원 공간에서 선분과 선분의 최단점(가장가까운점) 구하기
두 선분 L1과 L2가 존재할때 두선분의 최단점을 구해보자.
일단 두선분을 직선의 방적식으로 나타내면 아래와 같다.
P0과 Q0를 이은 벡터(P0-Q0)를 W0라고 하고 구한 최단점을 P(sc), Q(tc) 최단점을 이은 벡터를 Wc라고 하자
위의 직선의 방정식으로 정리하면
또한 P0 - Q0를 W0라 한다면 아래와 같이 나타낼 수 있다.
최단점을 이은 벡터 Wc는 u와 v 벡터에 직교할 것이다.
위식들을 바탕으로 연립방정식을 만들 수 있다.
수식을 간단하게 하기위해 아래와 같다라고 하고 연립방정식을 sc와 tc에 대하여 풀면된다
한가지 생각해야 할 것이 두벡터가 평행할때 이다.
이 0이라면 두벡터는 평행할 것 이다.
최종적으로 구한 sc tc값을 직선의 방정식에 대입하면 해당점을 구할수 있다.
위의 수식대로 직선의 최단점을 구할수 있다. 하지만 선분이라면 최단점이 선분의 범위를 벗어나는것을 고려해야 한다.
위의 그림처럼 최단점하나가 선분의 범위 밖에 있거나 둘다 밖에 있을수도 있다. (초록색)
이경우 선분의 시작 혹은 끝점이 최단점이 되어야한다. (붉은색)
따라서 선분범위내에 존재 하기 위해서는 sc와 tc의 의 범위가 0에서 1사이어야 한다.
0보다 작다면 선분의 시작점을 가까운점으로, 1보다크다면 선분의 끝점을 가까운점으로 해야 될 것 이다.
sc가 0일경우 Wc의 최소길이를 생각해보자
Wc는 아래와 같이 구할 수 있다.
sc는 0이므로
Wc의 최소길이를 구해야하는데 을 구하는것이 계산이 쉬워진다.
구해진 식에서 t에대한 도함수를 구하면
식을 tc에 대하여 풀면
sc가 1일 경우를 생각해 보자
구해진식에서 t에대한 도함수를 구하면
식을 tc에 대하여 풀면
따라서 선분범위가 0~1을 벗어난다면 위의 두식으로 구할 수 있다.
AABB와 OBB (0) | 2014.10.27 |
---|---|
광선 vs 구 교차판정 (0) | 2014.10.27 |
선분 점 최단점과 최단거리 (0) | 2014.10.21 |
광선 점 최단점과 최단거리 (0) | 2014.10.20 |
구 vs 구 교차판정 (0) | 2014.10.20 |