슬라이드 1

Similar documents
<4D F736F F F696E74202D20C1A63137B0AD202D20C1F6C7FCC3E6B5B9C3B3B8AE>

슬라이드 1

슬라이드 1

슬라이드 1

(Microsoft PowerPoint - \301\24613\260\255 - oFusion \276\300 \261\270\274\272)

슬라이드 1

(Microsoft PowerPoint - \301\24615\260\255 - \303\346\265\271\303\263\270\256)

슬라이드 1

<4D F736F F F696E74202D20C1A63034B0AD202D20C7C1B7B9C0D3B8AEBDBAB3CABFCD20B9ABB9F6C6DBC0D4B7C2>

슬라이드 1

<4D F736F F F696E74202D20C1A63037B0AD202D20B1A4BFF8B0FA20B1D7B8B2C0DA>

슬라이드 1

chap 5: Trees

* Factory class for query and DML clause creation * tiwe * */ public class JPAQueryFactory implements JPQLQueryFactory private f

슬라이드 1

<4D F736F F F696E74202D20C1A63134B0AD202D20BBE7BFF8BCF6BFCD20C8B8C0FC>

<4D F736F F F696E74202D20C1A63130B0AD202D20C1F6C7FCB0FA20C7CFB4C3C0C720B7BBB4F5B8B5>

PowerPoint 프레젠테이션

PowerPoint Template

제 1 장 기본 개념

<4D F736F F F696E74202D B3E22032C7D0B1E220C0A9B5B5BFECB0D4C0D3C7C1B7CEB1D7B7A1B9D620C1A638B0AD202D20C7C1B7B9C0D320BCD3B5B5C0C720C1B6C0FD>

(Microsoft PowerPoint - \301\24608\260\255 - \261\244\277\370\260\372 \300\347\301\372)

Microsoft PowerPoint - ch10 - 이진트리, AVL 트리, 트리 응용 pm0600

PowerPoint 프레젠테이션

유니티 변수-함수.key

K&R2 Reference Manual 번역본

슬라이드 1

Microsoft PowerPoint - C++ 5 .pptx

제이쿼리 (JQuery) 정의 자바스크립트함수를쉽게사용하기위해만든자바스크립트라이브러리. 웹페이지를즉석에서변경하는기능에특화된자바스크립트라이브러리. 사용법 $( 제이쿼리객체 ) 혹은 $( 엘리먼트 ) 참고 ) $() 이기호를제이쿼리래퍼라고한다. 즉, 제이쿼리를호출하는기호

UI TASK & KEY EVENT

@OneToOne(cascade = = "addr_id") private Addr addr; public Emp(String ename, Addr addr) { this.ename = ename; this.a

Microsoft PowerPoint - 07-Data Manipulation.pptx

쉽게 풀어쓴 C 프로그래밍

(8) getpi() 함수는정적함수이므로 main() 에서호출할수있다. (9) class Circle private double radius; static final double PI= ; // PI 이름으로 로초기화된정적상수 public

Spring Data JPA Many To Many 양방향 관계 예제

<443A5C4C C4B48555C B3E25C32C7D0B1E25CBCB3B0E8C7C1B7CEC1A7C6AE425CC0E7B0EDB0FCB8AE5C53746F636B5F4D616E D656E74732E637070>

PowerPoint 프레젠테이션

03장.스택.key

(Microsoft PowerPoint - \301\24611\260\255 - \276\326\264\317\270\336\300\314\274\307)

PowerPoint 프레젠테이션

설계란 무엇인가?

어댑터뷰

13주-14주proc.PDF

C# Programming Guide - Types

Microsoft PowerPoint - es-arduino-lecture-03

Microsoft PowerPoint - ch09 - 연결형리스트, Stack, Queue와 응용 pm0100

12 강. 문자출력 Direct3D 에서는문자를출력하기위해서 LPD3DXFONT 객체를사용한다 LPD3DXFONT 객체생성과초기화 LPD3DXFONT 객체를생성하고초기화하는함수로 D3DXCreateFont() 가있다. HRESULT D3DXCreateFont

8 장데이터베이스 8.1 기본개념 - 데이터베이스 : 데이터를조직적으로구조화한집합 (cf. 엑셀파일 ) - 테이블 : 데이터의기록형식 (cf. 엑셀시트의첫줄 ) - 필드 : 같은종류의데이터 (cf. 엑셀시트의각칸 ) - 레코드 : 데이터내용 (cf. 엑셀시트의한줄 )

Frama-C/JESSIS 사용법 소개

슬라이드 1

[ 마이크로프로세서 1] 2 주차 3 차시. 포인터와구조체 2 주차 3 차시포인터와구조체 학습목표 1. C 언어에서가장어려운포인터와구조체를설명할수있다. 2. Call By Value 와 Call By Reference 를구분할수있다. 학습내용 1 : 함수 (Functi

PowerPoint Template

Microsoft PowerPoint - java1-lab5-ImageProcessorTestOOP.pptx

슬라이드 1

- JPA를사용하는경우의스프링설정파일에다음을기술한다. <bean id="entitymanagerfactory" class="org.springframework.orm.jpa.localentitymanagerfactorybean" p:persistenceunitname=

쉽게 풀어쓴 C 프로그래밊

OCW_C언어 기초

Microsoft PowerPoint - ch07 - 포인터 pm0415

Microsoft PowerPoint - 3ÀÏ°_º¯¼ö¿Í »ó¼ö.ppt

untitled

chap x: G입력

Contents Activity Define Real s Activity Define Reports UI, and Storyboards Activity Refine System Architecture Activity Defin

Microsoft PowerPoint 자바-기본문법(Ch2).pptx

Microsoft PowerPoint - chap02-C프로그램시작하기.pptx

A Hierarchical Approach to Interactive Motion Editing for Human-like Figures

컴파일러

JUNIT 실습및발표

Analytics > Log & Crash Search > Unity ios SDK [Deprecated] Log & Crash Unity ios SDK. TOAST SDK. Log & Crash Unity SDK Log & Crash Search. Log & Cras

프로그램을 학교 등지에서 조금이라도 배운 사람들을 위한 프로그래밍 노트 입니다. 저 역시 그 사람들 중 하나 입니다. 중고등학교 시절 학교 도서관, 새로 생긴 시립 도서관 등을 다니며 책을 보 고 정리하며 어느정도 독학으르 공부하긴 했지만, 자주 안하다 보면 금방 잊어

Microsoft Word - ntasFrameBuilderInstallGuide2.5.doc

PowerPoint Presentation

Microsoft PowerPoint - Java7.pptx

Convenience Timetable Design

게임 기획서 표준양식 연구보고서

<4D F736F F F696E74202D20C1A63038C0E520C5ACB7A1BDBABFCD20B0B4C3BC4928B0ADC0C729205BC8A3C8AF20B8F0B5E55D>

chap10.PDF

<4D F736F F F696E74202D20C1A63132B0AD20B5BFC0FB20B8DEB8F0B8AEC7D2B4E7>

Data structure: Assignment 3 Seung-Hoon Na December 14, 2018 레드 블랙 트리 (Red-Black Tree) 1 본 절에서는 레드 블랙 트리를 2-3트리 또는 2-3-4트리 대한 동등한 자료구조로 보고, 두 가지 유형의 레

초보자를 위한 C# 21일 완성

C프로-3장c03逞풚

윈도우시스템프로그래밍

슬라이드 1

[ 그림 8-1] XML 을이용한옵션메뉴설정방법 <menu> <item 항목ID" android:title=" 항목제목 "/> </menu> public boolean oncreateoptionsmenu(menu menu) { getme

; struct point p[10] = {{1, 2, {5, -3, {-3, 5, {-6, -2, {2, 2, {-3, -3, {-9, 2, {7, 8, {-6, 4, {8, -5; for (i = 0; i < 10; i++){ if (p[i].x > 0 && p[i

예제 1.1 ( 관계연산자 ) >> A=1:9, B=9-A A = B = >> tf = A>4 % 4 보다큰 A 의원소들을찾을경우 tf = >> tf = (A==B) % A

Lab 3. 실습문제 (Single linked list)_해답.hwp

슬라이드 1

adfasdfasfdasfasfadf

Endpoint Protector - Active Directory Deployment Guide

임베디드시스템설계강의자료 6 system call 2/2 (2014 년도 1 학기 ) 김영진 아주대학교전자공학과

Microsoft PowerPoint - chap03-변수와데이터형.pptx

C++ Programming

슬라이드 1

금오공대 컴퓨터공학전공 강의자료

Microsoft Word - PLC제어응용-2차시.doc

11강-힙정렬.ppt

UI TASK & KEY EVENT

윈도우즈프로그래밍(1)

Microsoft PowerPoint - Chapter 6.ppt

The C++ Programming Language 4 장타입과선언 4.11 연습문제 Hello,world! 프로그램을실행시킨다. 프로그램이컴파일되지않으면 B3.1 을참고하자. #include<iostream> //#include 문, 헤더파일, 전처리지시

Transcription:

핚국산업기술대학교 제 17 강지형충돌처리 이대현교수

학습안내 학습목표 광선을이용한다양한방식의충돌검사방법을익힌다. 학습내용 광선을이용한지형충돌검사와이를이용한지형위의캐릭터이동구현. 간단한 world editor의구현캐릭터지형위에배치, 이동및선택쿼리마스크 기능 사용법 다중쿼리마스크의사용방법

실습 TerrainWalk 지형위에서이동하는캐릭터

구현방법 캐릭터로부터지형까지광선을발사. 광선과지형갂의교점을구핚다. 캐릭터의위치를교점으로설정핚다.

class InputController void _putcharacterrightonterrain(void) Vector3 characterpos = mcharacterroot->getposition(); characterpos.y = 5000000; Ray characterray( characterpos, Vector3::NEGATIVE_UNIT_Y ); mrayscenequery->setray( characterray ); RaySceneQueryResult result = mrayscenequery->execute(); RaySceneQueryResult::iterator itr = result.begin( ); if ( itr!= result.end() && itr->worldfragment ) mcharacterroot->setposition(characterpos.x, itr->worldfragment->singleintersection.y, characterpos.z); 실습

실행결과 : 지형위에서이동하는캐릭터

광선의설정과발사 mrayscenequery = root->getscenemanager("main")->createrayquery(ray()); Vector3 characterpos = mcharacterroot->getposition(); characterpos.y = 5000000; Ray characterray( characterpos, Vector3::NEGATIVE_UNIT_Y ); mrayscenequery->setray( characterray ); 발사할광선을설정. 광선의발사에따른결과들 ( 지형과의교점 ) 을저장하는객체. RaySceneQueryResult result = mrayscenequery->execute(); 광선을발사함.

캐릭터위치조정 RaySceneQueryResult::iterator itr = result.begin( ); 광선발사의결과는반복자객체 itr 에저장됨. 광선발사의결과는 worldfragment( 여기는지형 ) 와 movable 의리스트임. if ( itr!= result.end() && itr->worldfragment ) mcharacterroot->setposition( characterpos.x, itr->worldfragment->singleintersection.y, characterpos.z); 교점의 y 좌표가결국은지형의높이가된다.

RaySceneQueryResult 자세히살펴보기 RaySceneQueryResult &result = mrayscenequery->execute(); RaySceneQueryResult::iterator itr = result.begin( ); RaySceneQueryResultEntry 의리스트 Real distance; MovableObject* movable; SceneQuery::WorldFragment* worldfragment; distance: 광선시작점으로부터, 교차되는오브젝트까지의거리 movable: MovableObject 엔터티, 광원등과같이장면노드에소속되는개체들. NULL 이면, MovableObject 가아니라는뜻임. worldfragement: 장면관리자에의해생성된 world geometry 의일부분과, 광선이교차된경우. worldframgement 의 type 는 WFT_SINGLE_INTERSECTION 이며 (RaySceneQuery 의결과는항상 ), worldfragment->singleinetersection 은교점을나타내는 Vector3 타입의값임.

실습 Place Character 지형위에캐릭터들을배치

구현내용 마우스왼쪽버튼을누르면캐릭터가지형위에만들어진다.

class InputController bool mousemoved( const OIS::MouseEvent &evt )... 중략... 실습 if (evt.state.buttondown(ois::mb_left)) Ray mouseray = mcamera->getcameratoviewportray( (float)evt.state.x.abs/(float)mwindow->getwidth(), (float)evt.state.y.abs/(float)mwindow->getheight()); mrayscenequery->setray(mouseray); RaySceneQueryResult &result = mrayscenequery->execute(); RaySceneQueryResult::iterator itr = result.begin( ); if (itr!= result.end() && itr->worldfragment) mcurrentnode->setposition(itr->worldfragment->singleintersection); return true;

bool mousepressed( const OIS::MouseEvent &evt, OIS::MouseButtonID id ) if (OIS::MB_Left == id) Ray mouseray = mcamera->getcameratoviewportray( (float)evt.state.x.abs/(float)mwindow->getwidth(), (float)evt.state.y.abs/(float)mwindow->getheight()); mrayscenequery->setray(mouseray); RaySceneQueryResult &result = mrayscenequery->execute(); RaySceneQueryResult::iterator itr = result.begin( ); if (itr!= result.end() && itr->worldfragment) Beep(330, 100); char name[16]; sprintf( name, "Professor%d", mcount++ ); Entity *ent = mscenemgr->createentity( name, "DustinBody.mesh" ); mcurrentnode = mscenemgr->getrootscenenode( )->createchildscenenode ( String(name) + "Node", itr->worldfragment->singleintersection ); mcurrentnode->attachobject( ent ); mcurrentnode->showboundingbox(true); return true; 실습

bool mousereleased( const OIS::MouseEvent &evt, OIS::MouseButtonID id ) 실습 if (OIS::MB_Left == id) mcurrentnode->showboundingbox(false); mcurrentnode = NULL; return true;

실행결과 왼쪽마우스버튼을누르면, 캐릭터가만들어지고, 마우스버튼을누른채로이동시키면캐릭터가이동된다. 마우스버튼을놓는위치에캐릭터가배치된다.

mousepressed: 마우스클릭위치에캐릭터를생성하고위치시킴 if (OIS::MB_Left == id) Ray mouseray = mcamera->getcameratoviewportray( (float)evt.state.x.abs/(float)mwindow->getwidth(), (float)evt.state.y.abs/(float)mwindow->getheight()); mrayscenequery->setray(mouseray); RaySceneQueryResult &result = mrayscenequery->execute(); RaySceneQueryResult::iterator itr = result.begin( ); if (itr!= result.end() && itr->worldfragment) Beep(330, 100); char name[16]; sprintf( name, "Professor%d", mcount++ ); Entity *ent = mscenemgr->createentity( name, "DustinBody.mesh" ); mcurrentnode = mscenemgr->getrootscenenode( )->createchildscenenode ( String(name) + "Node", itr->worldfragment->singleintersection ); mcurrentnode->attachobject( ent ); mcurrentnode->showboundingbox(true);

mousemoved: 왼쪽마우스버튼을이용핚캐릭터의드래깅 bool mousemoved( const OIS::MouseEvent &evt )... 중략... if (evt.state.buttondown(ois::mb_left)) Ray mouseray = mcamera->getcameratoviewportray( (float)evt.state.x.abs/(float)mwindow->getwidth(), (float)evt.state.y.abs/(float)mwindow->getheight()); mrayscenequery->setray(mouseray); RaySceneQueryResult &result = mrayscenequery->execute(); RaySceneQueryResult::iterator itr = result.begin( ); if (itr!= result.end() && itr->worldfragment) mcurrentnode->setposition(itr->worldfragment->singleintersection); return true;

실습 Select Character 지형위의캐릭터를선택및이동

구현방법 카메라로부터캐릭터를향해광선을발사해서, 그교차점을구핚다.

class InputController bool mousepressed( const OIS::MouseEvent &evt, OIS::MouseButtonID id ) if (OIS::MB_Left == id) mcurrentnode = NULL; 실습 Ray mouseray = mcamera->getcameratoviewportray((float)evt.state.x.abs/(float)mwindow->getwidth(), (float)evt.state.y.abs/(float)mwindow->getheight()); mrayscenequery->setray(mouseray); mrayscenequery->setsortbydistance(true); RaySceneQueryResult &result = mrayscenequery->execute(); RaySceneQueryResult::iterator itr = result.begin( ); for (itr = result.begin(); itr!= result.end(); itr++) if (itr->movable && itr->movable->getname().substr(0, 5)!= "tile[") mcurrentnode = itr->movable->getparentscenenode(); break; else if (itr->worldfragment) Beep(330, 100); char name[16]; sprintf( name, "Professor%d", mcount++ ); Entity *ent = mscenemgr->createentity( name, "DustinBody.mesh" ); mcurrentnode = mscenemgr->getrootscenenode( )->createchildscenenode( String(name) + "Node", itr->worldfragment->singleintersection ); mcurrentnode->attachobject( ent ); break;

bool mousemoved( const OIS::MouseEvent &evt )... 중략... if (evt.state.buttondown(ois::mb_left)) Ray mouseray = mcamera- >getcameratoviewportray((float)evt.state.x.abs/(float)mwindow->getwidth(), (float)evt.state.y.abs/(float)mwindow->getheight()); mrayscenequery->setray(mouseray); mrayscenequery->setsortbydistance(false); 실습 RaySceneQueryResult &result = mrayscenequery->execute(); RaySceneQueryResult::iterator itr = result.begin(); for (itr = result.begin(); itr!= result.end(); itr++) if (itr->worldfragment) mcurrentnode->setposition(itr->worldfragment->singleintersection); break;

실행결과

캐릭터의선택 bool mousepressed( const OIS::MouseEvent &evt, OIS::MouseButtonID id ) if (OIS::MB_Left == id) mcurrentnode = NULL; Ray mouseray = mcamera->getcameratoviewportray( (float)evt.state.x.abs/(float)mwindow->getwidth(), (float)evt.state.y.abs/(float)mwindow->getheight()); mrayscenequery->setray(mouseray); mrayscenequery->setsortbydistance( true ); 광선을발사한결과, 만들어진교점들을거리순으로정렬하도록설정. 반복자를통해서얻게되는맨처음교점은, 광선의시작점 ( 즉, 카메라 ) 으로부터가장가까운교점이됨.

for ( itr = result.begin( ); itr!= result.end(); itr++) for 문안에서 itr 를반복함으로써, 광선과교차된오브젝트들을거리가가까운것부터확인해나감. if (itr->movable && itr->movable->getname().substr(0, 5)!= "tile[" ) 오브젝트가 MovableObject 이지만, 지형오브젝트가아닐경우 결과적으로엔터티일경우에 참고 : 지형장면관리자는지형을여러개의타일로구성된 MovableObject 들을생성해서만든다. 이때오브젝트의이름은 tile[ 로시작된다. mcurrentnode = itr->movable->getparentscenenode( ); break; 엔터티에해당되는노드가얻어지면, 그노드를선택하면되므로, 더이상다른교차되는오브젝트들은처리할필요가없다.

캐릭터의이동 bool mousemoved( const OIS::MouseEvent &evt )... 중략... if (evt.state.buttondown(ois::mb_left)) Ray mouseray = mcamera- >getcameratoviewportray((float)evt.state.x.abs/(float)mwindow->getwidth(), (float)evt.state.y.abs/(float)mwindow->getheight()); mrayscenequery->setray(mouseray); mrayscenequery->setsortbydistance(false); dragged 상태에서는지형상의교점만을찾으면됨. 거리를기준으로정렬하면, 지형이맨뒤로오게되므로, 다음 for 루프에서쓸데없이다른오브젝트들을처리하게된다. 따라서, 거리기준정렬을 false 로설정. RaySceneQueryResult &result = mrayscenequery->execute(); RaySceneQueryResult::iterator itr = result.begin(); for (itr = result.begin(); itr!= result.end(); itr++) if (itr->worldfragment) mcurrentnode->setposition(itr->worldfragment->singleintersection); break;

엔터티의선택시고려핛점 닌자와프로페서가카메라의시선에겹쳐있는경우 광선을발사하면, 닌자와프로페서중앞에있는것과먼저교차하게된다. 만약, 닌자가앞에있고, 프로페서가뒤에있는상황에서, 프로페서를선택하려면? 엔터티의이름을차례로살펴보면서, 프로페서이름을찾으면된다. 문제점은? 교차되는엔터티가매우많을경우, 특정종류의엔터티를찾으려면, 교차되는모든엔터티를읷읷이검사해야한다. 결국시간이많이걸릮다 성능이떨어진다.

쿼리마스크 (Query Mask) 란? Query Mask 모든 MovableObject 에고유한마스크값을설정 RaySceneQuery 에서, 광선을발사하기전에, 교차점을찾고자하는엔터티들의마스크값을지정. 지정된마스크값을가지는엔터티들에대해서교차점을찾는동작이수행됨.

실습 QueryMask 다른종류의캐릭터를효과적으로선택

class InputController bool mousepressed( const OIS::MouseEvent &evt, OIS::MouseButtonID id ) 중략 mrayscenequery->setquerymask(mninjamode? NINJA_MASK : PROFESSOR_MASK); 중략 if (mninjamode) sprintf( name, "Ninja%d", mcount++ ); ent = mscenemgr->createentity( name, "ninja.mesh" ); ent->setqueryflags( NINJA_MASK ); else sprintf( name, "Professor%d", mcount++ ); ent = mscenemgr->createentity( name, "DustinBody.mesh" ); ent->setqueryflags( PROFESSOR_MASK ); 후략 실습

class InputController 중략 private: 중략 실습 enum QueryFlags NINJA_MASK = 1 << 0, PROFESSOR_MASK = 1 << 1 ; 중략

실행결과 닌자선택모드에서클릭하면, 뒤에서있는닌자가선택된다. 스페이스키로닌자모드또는프로페서모드를토글할수있음.

마스크값기본값정의 class InputController enum QueryFlags NINJA_MASK = 1 << 0, PROFESSOR_MASK = 1 << 1 ; 각엔터티마다구별될수있는마스크값을부여.

엔티티가생성될때, 마스크값을부여 if (mninjamode) sprintf( name, "Ninja%d", mcount++ ); ent = mscenemgr->createentity( name, "ninja.mesh" ); ent->setqueryflags( NINJA_MASK ); else sprintf( name, "Professor%d", mcount++ ); ent = mscenemgr->createentity( name, "DustinBody.mesh" ); ent->setqueryflags( PROFESSOR_MASK );

광선발사핛때, 마스크값을설정 mrayscenequery-> setquerymask(mninjamode? NINJA_MASK : PROFESSOR_MASK); 광선을발사하기전에 (execute() 함수실행전에 ), query mask 를현재모드에따라, PROFESSOR_MASK 또는 NINJA_MASK 로설정한다. RaySceneQueryResult &result = mrayscenequery->execute(); 마스크값으로미리설정된엔터티들에대해서만, 교차점검사가이루어진다. RaySceneQueryResult::iterator itr = result.begin( );

다중쿼리마스크값의정의 각각의쿼리마스크는이진수로표현했을때, 반드시핚개의비트 1 만을가져야하며, 그자리수가각각달라야핚다. 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000

다중쿼리마스크값의정의 각각의쿼리마스크는이진수로표현했을때, 반드시핚개의비트 1 만을가져야하며, 그자리수가각각달라야핚다. 최대 32 개의쿼리마스크값을만들수있다. 00000001 = 1<<0 00000010 = 1<<1 00000100 = 1<<2 00001000 = 1<<3 00010000 = 1<<4 00100000 = 1<<5 01000000 = 1<<6 10000000 = 1<<7

다중쿼리마스크의사용예 (1) enum QueryFlags FRIENDLY_CHARACTERS = 1<<0, ENEMY_CHARACTERS = 1<<1, STATIONARY_OBJECTS = 1<<2 ; FRIENDLY_CHARACTERS 타입의경우에만, RaySceneQuery 의실행. mrayscenequery->setquerymask( FRIENDLY_CHARACTERS ); ENEMY_CHARACTERS 또는 STATIONARY_OBJECTS 의경우에, RaySceneQuery 실행 mrayscenequery->setquerymask(enemy_characters STATIONARY_OBJECTS);

다중쿼리마스크의사용예 (2) FRIENDLY_CHARACTERS 타입이아닌경우에만, RaySceneQuery 의실행. mrayscenequery->setquerymask( ~FRIENDLY_CHARACTERS ) FRIENDLY_CHARACTERS 또는 STATIONARY_OBJECTS 가아닌경우에만 RaySceneQuery 실행 mrayscenequery ->setquerymask(~(friendly_characters STATIONARY_OBJECTS));

다중쿼리마스크의사용예 (3) mrayscenequery->setquerymask( 0 ); 지형과만나는점만을얻고자할때는, MovableObject 와의교점을찾을필요가없다. 0 으로쿼리마스크를설정하면, WorldFragment 오브젝트만을얻어낼수있다. SetQueryMask() Basically MovableObject instances will only be returned from this query if a bitwise AND operation between this mask value and the MovableObject::getQueryFlags value is non-zero.

QueryTypeMask 사용자가정의하는쿼리마스크외에 SceneManager 에서미리정의된또핚종류의쿼리마스크로써 QueryTypeMask 가있음. QueryMask 는오브젝트읶스턴스하나하나에마스크를부여. QueryTypeMask 는오브젝트그룹에마스크를부여. 모두 6 종류의마스크가있음. 설정된기본값은 ENTITY_TYPE_MASK 사용법 : mrayscenequery->setquerytypemask(scenemanager::fx_type_mask); WORLD_GEOMETRY_TYPE_MASK ENTITY_TYPE_MASK FX_TYPE_MASK STATICGEOMETRY_TYPE_MASK LIGHT_TYPE_MASK USER_TYPE_MASK_LIMIT //Returns world geometry. //Returns entities. //Returns billboardsets / particle systems. //Returns static geometry. //Returns lights. //User type mask limit.

학습정리 광선을이용하면다양핚방식으로충돌검사를구현핛수있다. 오브젝트와지형의충돌 오브젝터에지형을향해광선을발사하여교점을구함. 오브젝트의선택 카메라로부터씬을향해광선을발사하여, 그교점에있는오브젝트들을선택함. QueryMask 를이용하면, 선택적인충돌검사를핛수있음.