에러는 없었지만 좌표값이 이렇게 찍혀야 하는데 

좌표가 이상하게 나와서 y축 범위가 이상하다 판단하여 코드에서 좌표값을 얻어오는곳을 확인해보니

void CMouse::WndProc(UINT iMessage, WPARAM wParam, LPARAM lParam)
{
	if (iMessage = WM_MOUSEMOVE) {
		position.x = (float)LOWORD(lParam);
		position.y = (float)LOWORD(lParam);
	}
	if (iMessage == WM_MOUSEWHEEL) {
		short temp = (short)HIWORD(wParam);
		wheelPreValue = wheelValue;
		wheelValue += (float)temp;

	}
}

y좌표가 이상하다는걸 알았습니다.

position.x = (float)LOWORD(lParam);
position.y = (float)LOWORD(lParam);

 

참조링크:http://soen.kr/lecture/win32api/lec4/lec4-2-1.htm

 

Win32 API 입문 강좌

윈도우즈와 같은 GUI운영체제에서는 키보드보다 마우스가 더 많이 사용된다. 윈도우즈의 공식 입력 장치는 키보드이지만 그래픽 툴이나 DTP, CAD 등의 복잡한 프로그램에서는 마우스가 주요 입력 장치로 사용된다. 여기서 마우스라고 함은 진짜 쥐새끼처럼 생긴 마우스는 물론이고 노트북의 터치패드, 트랙볼과 출판용 타블릿 등을 모두 포함하는 명칭이다. 키보드 입력 처리를 메시지로 하는 것과 마찬가지로 마우스 입력 처리도 메시지를 받아 처리한다. 마우스 입력에 관

soen.kr

#define LOWORD(l)           ((WORD)(((DWORD_PTR)(l)) & 0xffff))

IParam의 좌표의 위치가 잘못되었다는걸 알았습니다. 

그래서 HIWORD로 바꾸어 주었습니다.

변경전:

position.x = (float)LOWORD(lParam);
position.y = (float)LOWORD(lParam);

변경후:

position.x = (float)LOWORD(lParam);
position.y = (float)HIWORD(lParam);

OBB충돌을 이해하기 위해서 조금 시간이 걸리긴 했지만 외국 사이트 내용이 생각보다 쉽지 않아서 국내 블로그를 전전하다가 굉장히 설명이 잘되있는곳을 알게 되었습니다.
링크:http://www.gingaminga.com/Data/Note/oriented_bounding_boxes/

Object Oriented Bounding Box 를 이용한 Collision Detection

Object Oriented Bounding Box 를 이용한 Collision Detection 96419-044 안원선 출처; http://mimosa.snu.ac.kr/~rabbit2/ <목차> 소개글 이론 코드 다운로드 및 사용법 참고 문헌 웹페이지 다운로드 1. 소개글 지금까지 리서치 주제로 BSP tree 라던지 bounding sphere에 의한 collision detection(이하 CD)은 많이 있었는데, 그에 비해 bounding bo

www.gingaminga.com

솔직히 다른곳은 설명을 봐도 잘모르겠더라고요 
여기 링크된곳이 가장 설명이 좋은것 같습니다. 혹시나 다른곳이 있으면 링크라도 남겨주세요
저는 위 링크 블로그를 참조하여 좀더 보기좋게 직관적으로 설명을 드리려고합니다.
 

예를들어 박스의 충돌이 일어날때 AABB충돌은 면과 면의 충돌이지만 여기서 보이는 A박스와 B박스는 A박스가 기울어진 상태로 부딫치면 면과면이 아닌 모서리가 먼저 닿게 됩니다.
그래서 박스가 좀더 커진 상태로 충돌이 될 위험성이 있습니다. 이를 방지하기 위해 만들어진 obb 충돌이 있습니다.
그렇다면 어떤걸 이용해서 충돌이 일어나는지에 대해서 알아야합니다.
 

이런식으로 A박스가 움직이는 박스이고 B가 이제 멈춰있는 박스라고 가정을 해보겠습니다.
 

이부분은 제가 글을 보면서 이해하는 부분이어서 확실치는 않습니다 만약 틀리면 조금더 수정을 하도록하겠습니다.
Separation axis는 가상의 선으로서 마치 저희가 보는 실제하는 차원이 3차원이라는 공간의 영역입니다. 
그렇다면 사진을 찍으면 저희는 2차원이라는 면의 영역으로 나타납니다. 이를 저는 projection이라고 이해했습니다.
Separation axis는 카메라의 역할을 하는 부분이라고 생각하면될것 같습니다.
 
그렇다면 저희는 A박스와 B박스를 separation axis로 projection(투영)을 합니다. separation axis를 L이라는 벡터라고 가정하겠습니다. 투영할때는 가장 긴 가장자리로 합니다.
 

위의 그림처러 이제 빨간 부분이 바로 projection(투영) 된 A와 B입니다.
projection(투영)을 시킨 영역을 이용해서 저희는 충돌이 되었는지 안되었는지를 감지합니다.
 
그림을보시면 

조금 헷갈릴수도 있습니다 하나씩 설명드리겠습니다.  A중점와  B  중점의 거리는 T라고 하겠습니다 
마찬가지로 T 또한 projection이 가능합니다.  그리고 저희는 이 T는 방향성을 가진 벡터입니다. 
즉 A에서 B로 가는 방향성을 가진 벡터라고 가정을 하면 저희는 이걸 스칼라로 바꾸기 위해서 L과
T의 내적을 구합니다. 그렇다면 즉 충돌의 범위가 나오게됩니다.(이부분은 벡터의 내적에 대해서 이해하셔야합니다.)
 
그다음 저희는 ra(노란범위)라는 projection된 범위와 rb(노란범위)라는 projection된 범위가 T ,L 내적보다 작으면 충돌이 발생하지 않고 있다는 뜻입니다 반대로 T,L내적보다 ra,rb (노란범위)합이 더 크면 충돌이 발생했다는 뜻입니다.
수식으로 나타내면 -> T·L >ra+rb (충돌 아님)
                            T·L <=ra+rb (충돌)
T L은 내적이기에 스칼라이면 ra,rb또한 스칼라입니다. 그렇다면 ra, rb는 어떻게 구하는지 알아보도록 하겠습니다.
기억하셔야합니다. 벡터의 내적은 벡터가 아니라 스칼라입니다.
 
ra, rb 이번에 어떻게 구해야하는지 알아보겠습니다. 
 

 
먼저 벡터의 합과 곱을 알아보도록 하겠습니다. 벡터는 합은 벡터 그대로 나오며 벡터의 내적은 스칼라는 사실을 알고 가야합니다. 위의 그림을 참고하시면 같은 90도의 벡터를 계산을 해도 합과 내적은 다른계산이 된다는 사실을 잊으면 안됩니다.
ra는 먼저 
 

그림을 보시면 a1 과 a2의 벡터의 합입니다. 그리고 아래 그림의 분리축인 L에게 내적을 한 값이
 

그리고 위 그림의 분리축벡터 L과 벡터 (a1+a2)의 내적을 한 값 ra입니다.
rb도 같은 방법으로 계산을 하면됩니다. 
나머지 방향으로도 마찬가지로 계산을 해주시면됩니다.
 

'프로그래밍언어 > C++' 카테고리의 다른 글

마우스 좌표값 얻어오기  (0) 2019.09.27
Save data Text file  (0) 2019.09.20
Translation Matrix  (0) 2019.09.04
C++ <AABB Collision>  (0) 2019.08.19
C++ <Random>  (0) 2019.08.17

translation matrix 모습입니다. Vx,Vy,Vz 좌표는 (x ,y,z) 벡터이다 즉 방향성을 가지는 값이다. 그래서 Vx는 말그대로 x의 변화량이라고 생각하면될것 같습니다.

Translation matix를 p는 position 값입니다. 고등학교 때를 기억해서  계산을 하면 저런 형태의 모습을 값이 나옵니다. 

좌표의 4번째는 1은 방향성입니다.

 

즉(x ,y z)-> (x+Vx, y+Vy, z+Vz) 이렇게 해서 값이 바뀝니다. 정 이해가 안가신다면 

(Vx, Vy ,Vz) =(5,4,3)  이라고 가정하겠습니다. 그리고 (Px, Py ,Pz) = (1,1,1)이라고 가정하겠습니다. 계산해보면 

(1+5,1+4,1+3)입니다. ->(6,5,4) 위치가 변경이 됩니다. 

이런식으로 어떠한 위치값을 변경시킬때 사용을 하는것을 Translation matix라고합니다.

참고 링크: https://en.wikipedia.org/wiki/Translation_(geometry)

https://www.youtube.com/watch?v=UvevHXITVG4

 

Translation (geometry) - Wikipedia

From Wikipedia, the free encyclopedia Jump to navigation Jump to search A translation moves every point of a figure or a space by the same amount in a given direction. A reflection against an axis followed by a reflection against a second axis parallel to

en.wikipedia.org

 

'프로그래밍언어 > C++' 카테고리의 다른 글

마우스 좌표값 얻어오기  (0) 2019.09.27
Save data Text file  (0) 2019.09.20
OBB(Object Oriented Bounding Box) Collision  (2) 2019.09.10
C++ <AABB Collision>  (0) 2019.08.19
C++ <Random>  (0) 2019.08.17

프로그램 작성시 간혹 실수하는 부분인데  이미지 파일의 오류가 나서 scale이 없는 경우가 발생합니다. 이때 sprite 클래스나 다른 scale 값이 잘못 들어가나 라고 판단 할수 있습니다. 

다시한번 이미지 파일이나 이미지 파일 경로가 잘못되어 있는지 확인하는것이 중요합니다. 

//최초 SRV 생성
	HRESULT hr;
	ID3D11ShaderResourceView* srv;
	hr = D3DX11CreateShaderResourceViewFromFile(Device, file.c_str(), NULL, NULL, &srv, NULL);
	assert(SUCCEEDED(hr));

이름값형식

error-> 

scale 식별자 "scale"이(가) 정의되어 있지 않습니다.

 


D_SCL-SECURE_NO_WARNING ERROR 해결법

처음 격어보게 되어 남기게 되었습니다.

코드를 다른 컴퓨터에서 작업할시에   
심각도 코드 설명 프로젝트 파일 줄 비표시 오류(Suppression) 상태
오류


C4996'std::copy::_Unchecked_iterators::_Deprecate': Call to 'std::copy' with parameters that may be unsafe - this call relies on the caller to check that the passed values are correct. To disable this warning, use -D_SCL_SECURE_NO_WARNINGS. See documentation on how to use Visual C++ 'Checked Iterators' test c:\program files (x86)\microsoft visual studio\2017\community\vc\tools\msvc\14.14.26428\include\xutility 2483



발생하는 에러가 발생하였을때 해결법 

보통 일반적인 전역 헤더파일이 존재할것이다.


예제) 전역헤더

    #pragma once
    #include
    #include
    #include
    #include
    #include
    using namespace std;




처음 격어본 에러로써 해결방법으론 


  

   #define  _SCL_SECURE_NO_WARNINGS




전역 헤더에서 가장위에 선언을 해주는것이다.


예제) 전역헤더 (추가  #define  _SCL_SECURE_NO_WARNINGS)


    #pragma once
    #define  _SCL_SECURE_NO_WARNINGS
    #include
    #include
    #include
    #include
    #include
    using namespace std;


    
    
    이렇게 하면 기존의 소스 코드를 전혀 변경하지 않고 컴파일할 수 있습니다. 단지, 보안 취약점은 여전히 안고 간다는 문제가 있다고 합니다.
    
    
    참조 사이트 입니다: https://stackoverflow.com/questions/25046829/what-does-use-d-scl-secure-no-warnings-mean
                       https://www.sysnet.pe.kr/2/0/11317 

일반적으로 쓰이는 AABB collision에 대해서 공부해보려고 합니다

정확한 설명이 좋은 사이트들이 없어서 처음부터 하나하나 개념을 잡아보려합니다.

 

https://kishimotostudios.com/articles/aabb_collision/

 

AABB 2D Collision Detection

An example showing how to detect collision between two AABB (Axis-Aligned Bounding Box) in 2D (uses HTML5/JS).

kishimotostudios.com

AABB관한 괜찮은 시뮬레이터입니다 이걸 참고하면서 RECT와 같은 함수를 사용하는게 아니라 vertex들로 이용한 

AABB 충돌처리에 대해서 이해해보려합니다.

 

첫번째 간단한 collsion은 우리가 사각형의 중점을 구하는것입니다. 

 

먼저 앞서 우리는 3개 vertex로 삼각형을 구현할수 있습니다.

DeviceContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);

이후 우리는 총 6개의 vertex로 삼각형을 2개를 붙여서 사각형의 형태로 구현합니다.  만약 이부분에 대해서는 dIrect11x <device.cpp> 설명글에 올려두도록 하겠습니다.

앞서 AABB Collision에 간단 충돌처리와 연관된 원과 원의 충돌 처리에 대해서 알아보려합니다.

그 다음 그 두개의 중점 을 가지고 연결하는 방법은 우리가 잘알고는 수학공식인 좌표점의 거리계산입니다.

좌표간 거리 계산식 

 

그렇다면 두점사이에 충돌이 나려면 거리값이 0이 되면 됩니다. 하지만 우리는 원의 충돌이기 때문에 원의 반지름을 기억한다면 두 원의 반지름의 합의 이하값일때 충돌이 발생한다는 사실을 알려주면됩니다. 

중점간에 거리 계산 코드 

float Distance_caculator(Vertex moveBox, Vertex stopBox) {

	float distance_center_to_center;

	distance_center_to_center = sqrt(powf(moveBox.Position.x - stopBox.Position.x, 2) + powf(moveBox.Position.y - stopBox.Position.y, 2));
	
	return distance_center_to_center;
}

원이라고 했지만 사실상 사각형 두개에도 적용하면 적용이됩니다. 단지 일부 어느부분에선 닿지않아 충돌처리가 되지 않는 경우가 발생합니다. 

 

아래는 점과점의 거리를 이용한 충돌처리 코드입니다

bool Point_to_Point_Collision_circle(Vertex moveBox, Vertex stopBox,float  randomLocation_size, bool bCheck) {
	//bool bChecksub = true;
	float distance_center_to_center;
	distance_center_to_center = Distance_caculator(moveBox, stopBox);//calculator center to center distance

	if (distance_center_to_center <= 0.05 + randomLocation_size/2) {
		bCheck= false;
	}
	

	return  bCheck;
}

이제 사각형의 충돌처리를 위한 AABB collision인 vertex를 이용하는 방법에 대해서 해보려고 한다.

AABB 충돌

AABB 충돌은 각 사각형의 vertex 두점만 알고 있으면된다. 우리는 쉽게 생각해서 맨 왼쪽에 아래쪽에 점과 그리고 맨 오른쪽에 윗점만 알고 있으면된다.

Move박스와 Stop 박스의 회색으로 표시해둔 좌표값을 알아야한다. 

Stop box를 기준으로 Stop X1값부터 Stop X2값까지가 바로 Stop box의 좌우의 범위이다. 그렇다면 우리 move box는 y좌표와는 관계없이 Move X1과 X2값을 stop box 좌우값 범위에 넣어주면된다. 

 

그렇게되면 stop X1<= Move X1 <=stop x2 이때와 stop X1<= Move X2 <=stop x2 범위이다 즉 우리는 stop box의 왼쪽과 오른쪽으로 충돌에 대한 범위인 셈이다. 

 

반대로 위 아래에 관한 범위는 stop y1<= Move Y1 <=stop Y2 이때와 stop Y1<= Move Y2 <=stop Y2  이다 그렇다면 

이를 코드로 나타낸다면 

bCheck &= stopBox[5].Position.x >= moveBox[0].Position.x && stopBox[0].Position.x <= moveBox[0].Position.x+0.1 ; //right collision stop right move left
bCheck &= stopBox[5].Position.y >= moveBox[0].Position.y  && stopBox[0].Position.y <= moveBox[0].Position.y+0.1 ; //up collision   stop up move  down
bCheck &= stopBox[5].Position.x >= moveBox[5].Position.x  && stopBox[0].Position.x <= moveBox[5].Position.x+0.1; //left collision stop left move  right
bCheck &= stopBox[5].Position.y >= moveBox[5].Position.y  && stopBox[0].Position.y <= moveBox[5].Position.y +0.1; //down collision stop down move up

그렇다면 우리는 아마 Stop box안에 Move box가 온전히 들어가야만 한다. 하지만 AABB Collision의 의미는 닿는 순간에 검출하는것이다.

 

마지막으로 우리가 온전히 들어가는게 아닌 Move box의 크기값을 넣어주면된다. 범위는 그대로 지정되며 크기가 0.1의 정사각혀일 경우 작은 경우에는 -0.1 큰경우에는 +0.1을 해준다면 박스가 온전히 들어가기 전 범위가 될것입니다.

 

	bCheck &= stopBox[5].Position.x >= moveBox[0].Position.x-0.1 && stopBox[0].Position.x <= moveBox[0].Position.x+0.1 ; //right collision stop right move left
	bCheck &= stopBox[5].Position.y >= moveBox[0].Position.y-0.1  && stopBox[0].Position.y <= moveBox[0].Position.y+0.1 ; //up collision   stop up move  down
	bCheck &= stopBox[5].Position.x >= moveBox[5].Position.x-0.1  && stopBox[0].Position.x <= moveBox[5].Position.x+0.1; //left collision stop left move  right
	bCheck &= stopBox[5].Position.y >= moveBox[5].Position.y-0.1  && stopBox[0].Position.y <= moveBox[5].Position.y +0.1; //down collision stop down move up

완성된 AABB 충돌 코드입니다.

 

bool AABB_Collision_size_first(Vertex* moveBox, Vertex* stopBox, bool bCheck)
{
	bCheck = true;
	bCheck &= stopBox[5].Position.x >= moveBox[0].Position.x-0.1 && stopBox[0].Position.x <= moveBox[0].Position.x+0.1 ; //right collision stop right move left
	bCheck &= stopBox[5].Position.y >= moveBox[0].Position.y-0.1  && stopBox[0].Position.y <= moveBox[0].Position.y+0.1 ; //up collision   stop up move  down
	bCheck &= stopBox[5].Position.x >= moveBox[5].Position.x-0.1  && stopBox[0].Position.x <= moveBox[5].Position.x+0.1; //left collision stop left move  right
	bCheck &= stopBox[5].Position.y >= moveBox[5].Position.y-0.1  && stopBox[0].Position.y <= moveBox[5].Position.y +0.1; //down collision stop down move up
	return bCheck;
}

 

'프로그래밍언어 > C++' 카테고리의 다른 글

마우스 좌표값 얻어오기  (0) 2019.09.27
Save data Text file  (0) 2019.09.20
OBB(Object Oriented Bounding Box) Collision  (2) 2019.09.10
Translation Matrix  (0) 2019.09.04
C++ <Random>  (0) 2019.08.17

헤더파일 :

#include<iostream> // rand 함수 라이브러리
#include<time.h> //타이머 라이브러리 

사용되는 함수 

srand(time(NULL)); //시간 seed를 뿌림
rand();//시간 시드를 받은 랜덤 변수 함수 

ex)

#include<iostream>
#include<time.h>

int main(){

srand(time(NULL))
cout<<rand()%100<<endl; // 0~100까지 랜덤 변수

system("pause");
return 0;


}

'프로그래밍언어 > C++' 카테고리의 다른 글

마우스 좌표값 얻어오기  (0) 2019.09.27
Save data Text file  (0) 2019.09.20
OBB(Object Oriented Bounding Box) Collision  (2) 2019.09.10
Translation Matrix  (0) 2019.09.04
C++ <AABB Collision>  (0) 2019.08.19

우선 아래 링크 깃허브 링크로 들어가서 회원가입을 해줍니다.

 

https://github.com/

 

Build software better, together

GitHub is where people build software. More than 40 million people use GitHub to discover, fork, and contribute to over 100 million projects.

github.com

 

회원가입 후 로그인하시면됩니다.

 

오른쪽 상단에 + 부분을 눌러서 your profile을 들어가시면됩니다.

일단 우리는 계정이 생성 된걸 알수가 있습니다.

그렇다면 다시 우리는 이전링크에 있던 git bash를 우리가 원하는 파일에서 열어줍니다.

처음 실행시 우리는 이름과 아이디를 입력해주어야합니다.

git config --global user.name "  your name  "  // your name 여기다가 원하시는 이름을 넣으시면 됩니다.
                                                //ex)git config --global user.name "  ddubi  "
git config --global user.email"your_email@example.com" //git commit에 사용되는 email입니다 
                                                        //ex)git config --global user.email"ddubi@티스토리.com"
git config --list // 설정한 내용 확인                                                         

이제 간략한 git bash에서 사용되는 명령어 용어들을 정리할것입니다.

 

git --version : git 버전 확인

git init : git 저장소 초기화

git add 파일명 :파일 git에 추가 

git commit -m " 파일 메세지" : git에 파일에 설명을 추가해줍니다 ex) version 0.0 저는 보통 버전으로 많이 표기합니다

git commit -C HEAD -a --amend : 지정한 git의 로그메시지를 다시 사용하여 기존 컷밋 수정

git status: commit 상태 조회

git diff : stage 영역과 현재 작업 트리의 차이점을 보여줌

git mov 파일명 새파일명 : 기존에 존재하는 파일을 새파일로 이동 

git check out 파일명 : stage이나 commot 하지 않는 파일의 변경 내용 취소하고 이전 commit 상태로 돌아감

 

기본적인 명령어는 여기까지 정리하였으며 차후 더 업데이트하겠습니다.

 

출처 : https://blog.outsider.ne.kr/572

+ Recent posts