해외여행시 첫번째로 잊지 말아야하는 요소가 바로 환전이 아닐까 싶은데요, 이번에 베트남을 다녀오면서 저역시 환전을 어떻게 할 것인가로 고민을 좀 했습니다.
베트남을 다녀오신 분들은 아시겠지만 원화에서 바로 베트남 동으로 환전하는 것이 효율적이지 않으므로 달러로 환전한 후 베트남 공항 등에서 동으로 환전을 하실텐데요. 환전소마다 수수료도 다르고 요율이 달라 실갱이가 있는 경우도 있고 이곳 저곳 정보를 찾느라 고생이시리라 생각됩니다. 사실 공항 환전소는 별로라고 알고 있고 저역시 2년전에 다녀오면서 좋지 않은 기억이 있습니다.
오늘 소개해 드릴 정보는 바로 위와 같은 고민을 없애줄 수 있는 괜찮은 아이템을 찾아 소개해 드릴까 합니다.
트레블 월렛 (Travel walet )
직역해보자면 여행 지갑 정도 되겠네요.
관련한 장점이 많이 인터넷에 소개되어 있으니 중요한 내용, 사용 방법만 작성하겠습니다.
사전 준비
출국 1주일 전에는 가입하자!
실물 카드를 반드시 신청하여 발급 받는다. (3~5일 소요)
장점
원 > 달러 > 동 의 절차 없이 원 > 동 으로 바로 환전 가능
이중 수수료 지출 불필요
원 > 동 환율만 적용 받음
실물 카드를 이용하여 현지 ATM (visa) 기계에서 바로 출금 가능
별도 환전소 이용 불필요
현금 인출 수수료 없는 경우도 있음 (good!)
필요한 만큼만 그때 그때 환전하여 출금 가능
실물 카드를 이용하여 매장에서 바로 결재 가능
환전 (충전) 방법
앱을 이용하여 바로 베트남 동을 충전 할 수 있는데요, 저는 일단 500만동을 충전 하였습니다. 달러 환전 없이 바로 동으로 환전하기 때문에 현재 원 -> 동 환율의 영향을 받기 때문에 환율이 쌀때 충전을 하면 보다 효과 적이라는 것을 알 수 있습니다.
구글에서 블로그 글 작성 시점인 2022년 8월 2일 현재 환율을 검색해 보면 아래와 같습니다.
실제 환율로 500만동을 원화로 해보면 278,700 원이라는 것을 알 수 있습니다. 살때, 팔때 수수료가 붙는 것을 고려해 보면 트레블 월렛에서 280,500 이라는 수수료를 포함한 금액이 매우 저렴한 것을 알 수 있습니다.
반응형
현금 인출 방법
ATM 기계 찾기 (구글 맵 등)
VISA 카드 지원이 되는 기계인지 확인, 실제 은행에서 운영하는 ATM 기계 추천
은행에서 운영하는 ATM 기계인 경우 수수료가 없는 경우도 있음
카드 입력
사용 언어를 English 선택
비밀번호 입력
Cash Withdrawal 선택
Default Account 선택 (없는 경우 Current Account)
찾을 금액 입력
영수증 받을 것인지 확인
현금 인출 완료
사진으로 보면 아래와 같습니다. (사진이 깨끗하지 않아 죄송합니다)
저는 다낭 한시장 근처에 있는 크록스 매장 (VuiVui shop) 맞은 편에 있는 SBC 은행 ATM 기계를 이용하였습니다.
(참고로 달러 -> 동 환전시에도 한시장 금은방이나 공항 환전소 보다 SBC 은행이 훠~~~얼 씬 저렴합니다.)
어렵지 않죠?
이번 인출에는 수수료 없이 30만동이 인출된 것을 확인할 수 있습니다
저의 경우 처음 사용 시 계정을 어떤 것을 사용할 것인지 묻는 창에서 좀 혼란 스러웠는데요, 위 7번에 소개한 것처럼 Default Account 또는 Current Account 로 선택하시면 됩니다. 다른 트레블 월렛관련 페이지에 그런 내용이 없어 좀 혼란 스러웠습니다.
시도해보시고 위의 계정이 동작 하지 않는다면 그냥 다른 기계로 바로 가시면 됩니다.
참고로 베트남 입국 시 공항에서 빠져 나오면 왼편에 환전소가 있는데요, 오른쪽에는 ATM 기계가 바로 있습니다. HSBL 은행 ATM 기계로 200만 동을 인출했을 때 5만동이 수수료로 나왔고요, 45만동을 인출할때는 수수료가 없었습니다. (why??)
총 500만동을 충전 했고 490만동을 찾을 수 있었습니다. 아마 일요일이어서 수수료가 붙은 것인지 모르겠습니다.
환전에 비하면 수수료가 비싼 편은 아니라고 생각되지만 개인적인 생각으로는 입국 시 평일이 아니라면 한번만 인출을 한 뒤 평일에 은행 ATM 기계에서 수수료 없이 인출을 하는 것이 최선일 것이라 생각됩니다.
또한 인출 수수료는 은행 ATM 기계마다 차이가 있는 것 같습니다. 평일 낮에 SCB 은행에서는 30만동, 5만동 등 소액을 찾아 보았는데 둘다 수수료가 없었으나 다른 지역의 은행 (CN QUANG NAM) ATM 기계에서는 200만동을 찾을 때 49,500 동이 수수료로 나왔습니다. 아마 은행 업무 날짜나 시간 등에 영향을 받는 것일 수도 있습니다. 권종에 따른 수수료가 있는지도 모르겠습니다.
어떤 기계는 10만동 미만의 지폐는 취급을 하지 않는 기계도 있었으니 참고 바랍니다.
환전한 돈이 남았다면 다시 원화로 환불 가능
끝으로 여행을 마치고 79,500 동이 트레블월렛 카드에 남았는데요. 남은 동은 다시 원화로 환불할 수 있어 해보니 4,412원으로 환불이 되었습니다. 팔때 환율로 바로 환불이 된 것인데요. 여행에서 남은 금액을 거의 손해 없이 환불 받을 수 있는점도 아주 좋은것 같습니다.
저도 사용해 보기 전엔 좀 걱정이었습니다. 특히 베트남 동의 경우 달러로 1차 환전한 뒤 베트남 동으로 환전하는 것이 일반 적이다보니 환전 수수료가 이중으로 나가는게 상당히 불편하고 부담스러웠고요, 요즘처럼 달러 환율이 높은 경우는 더더욱 그랬습니다.
그런데 트레블 월렛을 사용해 보니 너무 편리하고 수수료도 저렴하며 그때 그때 현지에서도 부족하면 바로 충전하여 인출할 수 있다는 큰 장점이 있어 여행시 여행 경비에 대한 계획에 좀더 자유로울 수 있다는 점과 visa 카드 가맹점에서 직접 결재가 가능하므로 트래블 월렛 실물 카드 이용시 국내 카드 수수료를 이중으로 지출할 필요가 없다는 점도 아주 큰 매리트 인것 같습니다.
이상으로 본 포스팅을 마칩니다.
혹시 잘못된 내용이 있다면 뎃글로 남겨주시면 수정하도록 하겠습니다.
코로나 관련하여 베트남 여행시 알아야 할 내용은 아래 포스트에 작성되어 있으니 참고 부탁드립니다.
항공기 내에서 나누어 주는 노란색 검역 관련 서식 작성 (여권번호, 여행국, 증상 관련 정보)
입국장 진입 후 국내 입국 전 검역정보 제출 및 담당자 확인 (Q코드 입력자는 자동시스템 사용) (저는 수기입력 진행하였으며 Q 코드 사용자가 대부분이어서 사실 담당자 확인이 속도가 빨랐습니다)
여권에 PCR 검사 필요 스티커 부착
입국심사 (코로나 관련 별도 문의 없음)
입국 후 다음날 보건소 방문. 여권 보여주며 해외 입국자라고 하면 무료 PCR 검사 가능
익일 문자 메시지로 음성 결과 전송
Q-code 홈페이지에서 '입국 후 검사등록' 으로 이동하여 관련 정보 입력
음성인 경우 메시지 화면 캡쳐후 파일로 등록
여기까지가 모든 과정이었습니다.
저도 출국 전 많은 걱정이 있었고 고민도 많았으나 생각보다 절차가 복잡하지 않았고 큰 문제 없이 진행이 잘 되었습니다.
호텔 예약시 PCR 음성 확인서가 체크인시 필요하다는 내용이 있어 직접 호텔로 문의 해 보았으나 필요없다는 답변을 받았고 베트남 관광청에서 입국시 여행자 보험이 필요한 것으로 나와있었지만 베트남 입국시 사실 별도의 확인 과정이 없이 기존 코로나 이전처럼 입국이 가능했습니다.
베트남 국민들은 사실 코로나로 인한 생활에 큰 차이가 있는지 모를 정도로 외부에서는 마스크를 착용하지 않은 분들이 대부분이었고 실내에서 일하는 서비스 직 인원들 정도만 마스크를 착용하고 있었습니다. 호이안과 오행산등의 여행지에서도 코로나로 인한 어떤 제약이나 제지 없이 관광이 가능했습니다.
2년 전에 다녀온 베트남에 비하여 크게 변한게 없는 것을 보며 관광으로 큰 경제 수혜를 보는 다낭인 만큼 코로나로 인해 많은 부분에 타격이 있었음을 느낄 수 있었습니다. 그래서인지 공항에서 무료로 신속 항원 검사를 해주는 등 더욱 적극적으로 외국 관광객을 유치하려고 노력하는 것처럼 보였습니다. 사실 베트남에서 국내 입국시에도 별도 기관에서 PCR 검사를 받을 필요가 없다는 점도 요즘 같은 시기에 여행의 부담을 줄여주는 좋은 제도라고 생각 됩니다.
여전히 베트남은 관광객에게 친절하고 소박한 나라였고 저렴하고 맛있는 음식들이 많은 멋진 휴양지임은 달라지지 않았습니다.
여행의 과정이 코로나 이전에 비하여 생각보다 어렵지 않았고 부담스러울 것도 없었으므로 길고긴 코로나 여파로 지친 몸과 마음을 즐거운 여행으로 달래보시길 바랍니다.
베트남 동 환전 관련한 트레블 월렛 사용기, ATM 인출 방법은 아래 포스트를 참고해 주세요
최대한 얇게 바르는 것이 중요하고요, 옻칠을 하기 전에 물론 나무는 500방 이상의 고운 사포로 매~~끈하게 다듬어진 상태여야 합니다.
자 옻칠을 한번 올린 상태입니다. 색감 너무 예쁘죠? 정말 너무너무 마음에 듭니다.
나무의 무늬가 그대로 보이죠? 원래 여러번 겹쳐 칠해서 나무표면의 강도도 올리고 옻칠 특유의 색상이 올라오게 해야 하지만 저는 이정도의 나무 질감이 보이는 것이 마음에 들어 1번만 칠해 주었습니다.
또 여기에 작업을 해야하거든요.
참고로 저는 처음 칠하는 과정에서 옻칠 건조장 같은게 있어야 하는줄도 모르고 그냥 칠했더니 세월아 네월아 마르지 않더군요. 옻은 습도 75 % 정도의 아주 습한 환경에서 잘 마른다고 합니다. 옻의 주성분이 우르시올이라는 성분이 습기와 만나 굳어진다고 하네요. 그것도 모르고 칠하고 그냥 뒀는데.. 영 마르지 않아 시간만 버렸습니다. 날씨가 건조하고 좋으면 절대 마르지 않습니다. 참고하세요. 옻칠 건조장이 없으시면 비오는 날이나 장마철에 칠하면 딱이겠습니다. 습도만 잘 맞으면 하루저녁이면 다 마른다고 합니다.
얼마후 장마철이 되고 나서야 대충 마른 듯 해서 다음 작업을 이어갈 수 있었답니다.
전 마르는데 거의 3주 정도 걸렸네요. ㅜㅜ
또한가지 에피소드는... 저렇게 칠하는 동안 아무렇지도 않았던 제가.. 적당히 마른 표면을 사포로 다듬어 주었는데.. 그때 나온 가루가 피부에 뭍은게 화근이었는데 양쪽 팔이 옻 알러지가 엄청나게 올라 고생을 좀 했었습니다. ㅋ
딸내미도 옆에서 도와준답시고 얼쩔거리다가 덩달아 옻 알러지가 올라 고생을 좀 했네요 ㅋㅋ
죽는거 아니니 큰 문제는 없겠지만... 행여나 걱정되시면 안하시는게 좋을 것 같기는 합니다.
자 . 어쨌든.. 딸내미가 원피스를 좋아한다고 했었죠?
그래서 원피스 주인공들의 현상금 수배서를 이용해서 바닥면 디자인을 해보았습니다.
적당한 이미지를 다운받은 뒤 포토샵으로 이리저리 자리 배치를 해봅니다.
뭔가 괜찮죠?
이걸 보드에 그린다고요? 네. 그릴겁니다.
자 이제 그려보겠습니다.
바닥면에 먼저 연필로 스케치를 합니다.
먼저 수배서 레이아웃을 그려넣습니다. 원래 도안과 달라져도 큰 상관 없습니다. 원래 도안이란게 뭐 첨부터 있던것도 아니고요.
그다음은 한칸한칸 주인공들의 모습을 그려넣어 줄거에요.
나중에 채색은 적당히 네임펜을 이용해서 해줄겁니다.
이후에 수성 바니쉬를 발라주면 튼튼하게 보호될 겁니다.
자.. 주인공들을의 스케치가 마무리 되었으면 한땀 한땀 네임펜으로 그려나갑니다.
일단 캐릭터는 다 그렸네요.
참쉽죠?
제가 특히 신경쓴 부분은 바로 상디 군의 포스터 입니다. ㅋㅋ
아깝게도 나미 양은 트럭에 좀 가리게 될 처지에 놓였고요, 제가 좋아하는 로빈양은 가리지 않도록 잘 배치했습니다.
WANTED 와 같은 글자를 계속 반복해서 써야 하는 게 매우 고생스러웠고요, 캐릭터들을 그리는건 매우 재미있었습니다.
자 뒷면그리는데 주말 하루 나절이 다 걸렸습니다.
ㅋㅋ 딸내미랑 붙어서 뒷면 그리는데 하루를 다 보냈습니다. 힘드네요.
이제 윗판을 그릴 차례인데요,
윗판은 검정색을 다 칠해준뒤 젯소를 이용해서 해적깃발을 그려줄겁니다.
근데 손으로 그리면 뭔가 지저분해질 것 같아서 시트지를 따낸뒤 스폰지로 찍어서 스텐실처럼 표현을 할 겁니다. 잘되려나 모르겠지만 그리 복잡한 형상은 아니니 걱정은 없습니다.
먼저 상판의 검은색을 칠하기 전 테두리 부분을 마스킹해줍니다.
상판 칠에는 딸내미가 또 도와 주었습니다.
다이소에서 산 1000 원짜리 검정 페인트로 상판을 칠합니다.
ㅋㅋ 옻칠까지 해놓고 왠 1000원짜리..
저나 딸내미나 옻 알러지가 올라 고생한거 생각하면 그냥 편하게 1000원짜리 페인트가 마음이 편합니다 ㅋ
요렇게 칠해진 데크를 잘 말리고 칠하고 말리고를 반복하면 이렇게 예쁜 검정색이 나옵니다.
자 이게 해적 깃발을 올려야 겠죠?
먼저 해적깃발 도안을 프린드 해서 시트지 위에 붙여줍니다.
이렇게 붙여준 시트지를 칼로 파내야 하는데요.
검정색 부분이 파내야 하는 부분입니다.
섬처럼 남겨진 조각이 떨어져 나가지 않도록 힘조절 하는게 관건이고요, 바닥면 종이가 완전히 뚫려서 떨어져 나가지 않도록 해야 하는 것이 중요합니다.
일단 양쪽 끝에 붙일 두개의 해적깃발을 완성하고 보드에 찍어 보기로 하였습니다.
솔직히 중앙에 들어갈 원피스 로고는 지쳐서 파낼 엄두가 안나더라고요.
어짜피 발로 계속 밟혀서 금방 떨어질거라며 합리화를 한 뒤 중앙의 로고는 빼기로 합니다.
ㅋ
먼저 시트지 위에 또다른 시트지를 붙여야 하는데.. 허벅지 같은 맨살에 시트지를 붙였다 떼어내서 점착력을 약하게 만듭니다.
그리고 파낸 시트지위에 붙인다름 아래쪽 종이를 떼어냅니다.
요렇게요.
요렇게 하면 섬처럼 남아있는 조각들이 원위치 그대로 붙어있을 수 있게 됩니다.
요거를 보드에 붙이는 거죠.
그런다음 매직블럭 같은 스펀지에 흰색 페인트나 젯소를 붙혀서 콕콕콕콕 찍어주면 구멍 뚫린 부분만 흰색 페인트가 뭍게 되겠죠?
바로 스텐실 기법 되겠습니다.
딸내미랑 같이 찎었는데 바깥부분에도 좀 삐져 나갔군요. ㅜㅜ
완전히 마르기 전에 젖은 천으로 닦아주면 됩니다.
음.. 백수 해적단 부분 페인트가 스티커에 달라붙어 조금 떨어져 나갔습니다 ㅜㅜ
옻칠위에 바로 칠한 검정 페인트가 역시 나무에 흡수된게 아니다 보니 떨어지는군요.
옻칠이 정말 방수가 확실한가봅니다. 좋은건지 나쁜건지...
흰수염 해적단 부분도 좀 지저분... 이럴려면 뭐하러 열심히 칼질을 한걸까 싶어 담배 생각이 나네요.
...
전체적으로 수성 바니쉬를 칠해서 말려줍니다. 한 두세번 정도 칠한것 같네요.
무광 바니쉬를 칠해주니 느낌이 좋습니다.
자 이제 트럭 장착을 해볼까?
뭐 트럭장착은 엄청 쉽습니다. 그냥 나사를 풀고 새로운 보드에 그대로 장착하면 끝. 더군다다 두개의 보드가 모두 티퍼래트 동일한 보드다 보니 뭐 신경쓸게 없네요.
그냥 트럭을 떼어내고 붙이면 끝 입니다.
딸내미 몸무게가 가벼워 킹핀 너트를 조금 풀어 주었습니다.
나 이제 나가볼까요?
후훗~
땔내미가 아주아주~ 마음에 들어 합니다.
세상에 하나뿐인 자기만의 롱보드라며 너~~무 좋다고 고맙다고 하네요.
아빠야 말로 땡큐베리 감사~
자 그럼 이제 달려볼까나!
ㅋㅋ 아주 마음에 들어하는 우리 딸내미 입니다.
아직 뭐 스킬이고 뭐고 없고요. 그냥 타고 달리는게 전부입니다. 카빙을 겨우 하는 정도랄까요?
자기는 그냥 앞으로만 가는게 재미있답니다. (무서운가봐요)
암튼 오늘도 나가서 무려 6km 나 달려주신 열정적인 딸내미
만들어준 보람이 넘쳐납니다.
자 여러분들도 세상에 하나뿐인 나만의 특별한 보드 하나 만들어 보시지 않으시렵니까?
취미를 더욱 취미로 진정 즐기기 위해 가장 필요한 것은 애정이 아닐까 생각해 봅니다. 내가하는 취미가 노동의 시간이라면, 그래서 즐겁지 않다면 그게 무슨 취미인가요. 정말 내손을 타고 태어난 결과물이 이렇게 사랑스러울 수 있는게 진정한 취미가 아닐까 생각됩니다.
저는 이제 트럭을 떼어낸 다른보드를 어떻게 꾸밀까 조금 고민을 해봐야 할 시간이 왔습니다.
선택한 셀에 이미지 파일명을 아래와 같이 shell 명령을 사용하면 이미지가 열리게 됩니다.
Dim wsh As Object
Set wsh = VBA.CreateObject("WScript.Shell")
wsh.Run imgName
전체 코드를 볼까요?
Sub showImage()
Dim aSht As Worksheet
Dim currentSelection As Range
Dim imgExtName As String
Dim imgName As String
Dim curext As String
Dim wsh As Object
Set wsh = VBA.CreateObject("WScript.Shell")
Set aSht = ActiveSheet
Set currentSelection = Selection.Cells()
imgExtName = ".png.jpg.jpeg.bmp.gif.webp.pct.ico...."
curext = LCase(Right(currentSelection.Value, 4))
If (InStr(imgExtName, curext)) Then ' 현재 선택한 셀 내용 중 이미지 확장자를 가지고 있으면
imgName = currentSelection.Offset(0, -1).Value & "\" & currentSelection.Value
If Dir(imgName) <> "" Then
wsh.Run imgName
End If
Else
MsgBox ("이미지 파일명이 들어있는 셀을 선택해 주세요")
End If
End Sub
선택한 셀이 이미지 파일명인지 아닌지는 확장자로 검사를 하도록 했습니다. imgExtName 이라는 문자열에 이미지 확장자들을 쭈욱 넣어둔 뒤에 실제 선택한 셀의 텍스트에서 뒤에서 4글자를 떼어낸 뒤에 위에 말씀드린 문자열 중에 포함되는지를 검사하는 것이죠.
아주 정교한 방식이라고 볼 수는 없지만 간단하게 구현할 수 있는 이미지 검출 방식이라 할 수 있겠습니다.
어쨌든 이렇게 이미지 파일명이 맞는지 확인한 뒤에 앞에있는 경로명과 결합해서 해당 이미지가 실제로 존재하는 이미지 인지 추가로 확인한 뒤에 shell 명령을 통해 이미지를 열어주게 됩니다.
저는 바로 왼쪽 옆칸에 경로가 있어 offset(0,-1) 과 같은 방법으로 연결하였지만 별도 셀에 이미지 경로가 들어있다면 해당 경로를 따로 지정해 주거나 스크립트 내에 문자열로 넣어 주셔도 되겠습니다.
이렇게 만들어진 매크로를 버튼에 연결하는 방법은
버튼을 최초 생성할때도 보였겠지만 매크로를 연결하는 메뉴가 있습니다. 단추에서 오른쪽 클릭한 다음 "매크로지정" 을 선택하면 매크로 선택창이 나타나게 되는데요, 여기서 지금 만들어준 스크립트를 선택해주면 됩니다.
자 이제 어떻게 동작하는지 한번 볼까요?
먼저 이미지 들이 들어있는 폴더가 있을 거고요. 만약 이미지가 아닌 셀을 선택하면 경고창을, 이미지 이름을 선택하면 윈도우 이미지 뷰어로 바로 열리게 됩니다.
자 간단하게 원하는 기능이 구현되었습니다.
필요하신 분들은 소스 복사하셔서 사용하시면 될 것 같고요. 잘 응용하셔서 본인의 엑셀 문서에 딱 맞는 기능으로 추가하시면 되겠습니다..
가끔 아니 어쩌면 자주 3D 공간안에서 물체의 위치를 지정할때 이 물체가 저쪽에 닿는 면에 딱 위치하고 싶은데... 할때가 있죠?
예를 들면 나무나 돌덩이 이런걸 랜덤하게 막 생성한 다음 굴곡진 지형에 모두 딱 안착시키고 싶다거나요.
또는 어떤 물체를 기준으로 어떤 방향으로 뻗어 나갈때 무엇인가 닿는 물체가 있는지 검사하고 싶을때도 있지요.
이때 사용되는 개체가 바로 Ray 입니다.
실제로 Ray를 알기 전과 알고난 뒤는 정말 다른 세계라고 할수 있겠습니다.
자 오늘은 Ray 에 대하여 알아보도록 하겠습니다.
3D 는 정말 놀라울 정도로 기하학적인 수학의 결정체라 할 수 있겠습니다. 이를 구현하기 위하여 정말 얼마만큼의 수학적 노력이 있었는지 상상이 안될 정도 입니다.
오늘은 그 결정체중의 하나인 Ray에 대하여 알아볼텐데요. 3DS MAX 에서 Ray 는 두가지 명령어를 통해 사용됩니다.
intersectRay 와 intersectRayEx, intersectRayScene 이렇게 세가지 입니다. 사용하는 목적에 따라 구분하여 사용하시면 되는데요. 각각은 아래와 같습니다.
intersectRay : Ray 와 대상물체를 지정한 뒤 부딧히는 위치를 알아낸다.
intersectRayEx : 위와 동일하며 부딪힌 Face 정보와 부딪힌 면의 normal 정보를 돌려준다
intersectRayScene : 대상 개체를 지정하지 않고 Scene 내의 어떤 물체든 부딪힌 정보를 돌려준다. (느림)
사용하는 방법은 간단한데요, 먼저 Ray 를 생성해주고 필요하면 Ray의 출발 위치(pos)와 방향(dir)을 변경할 수 있습니다.
myRay = ray [0,0,0] [0,0,-1]
ray 를 생성하는 구문 인데요, [0,0,0] 위치를 출발점으로 하고 [0,0,-1] 을 방향으로 하는 ray 가 만들어 지게 됩니다. [0,0,-1] 이라 하면 z 축을 기준으로 아래쪽을 바라보는 방향이라고 보면 되겠죠?
이렇게 만들어진 Ray를 위의 명령어와 함께 사용해볼까요?
먼저 위와 같은 Scene 을 만들어서 테스트 해보려 합니다. 노란색 공이 지면에 부딪히는 위치로 이동 시킬거에요. 중간에 네모 박스가 있지만 네모박스는 무시하고 지면에 위치시켜야 한다면 아래와 같이 intersectray 를 이용하여 위치시킬 수 있습니다.
-- ray 를 생성해 준다
myRay = ray [0,0,0] [0,0,-1]
-- 이동시킬 물체를 지정하자
obj = $Sphere001
-- ray 의 출발 위치를 물체의 중심으로 설정해보자
myRay.pos = obj.pos
-- 위치 검출에 사용될 지형을 지정해보자
tern = $terrain_01
-- intersectray 를 이용하여 지형과 부딪히는 위치를 찾아내자
interResult = intersectray tern myRay
-- 어떤 결과가 나왔는지 print 를 이용해서 살펴보자
print(interResult)
-- 부딪힌 위치에 오브젝트를 위치시키자
obj.pos = interResult.pos
요렇게 하면 어떻게 되냐면요
요렇게 노란 공이 지면에 달라 붙게 됩니다. 코드에 주석을 달아 놓았으니 따로 설명은 안드려도 될 것 같은데요. 한가지만 설명해 드리자면 intersectray의 결과값을 보면 (ray [-1.62331,11.1008,1.22501] [-0.407511,-0.107746,0.906822]) 요런 식으로 ray 의 형식으로 결과가 나옵니다. ray 는 pos 와 dir 의 속성이 있지 않습니까?? 여기서 결과값의 pos 정보가 바로 부딧힌 면의 위치 정보가 됩니다. 그 뒤에 나오는 [-0.407511,-0.107746,0.906822] 는 부딪힌 면의 normal 값으로 만약 공이 부딪힌 다음 튕겨나간다거나 하는 다음 동작이 필요하다면 반드시 필요한 정보이지요.
어쨌든 intersectray 만 보자면 부딪힌 위치와 각도를 ray 의 형태로 돌려준다는 것을 알 수 있었습니다. 특징이라 하면 , 특정 개체를 대상으로 하기 때문에 속도가 매우 빠릅니다. 사실상 성능을 고려하지 않아도 되는 함수죠.
그런데 만약 부딪힌 면이 어디인지 알아야 하고 부딪힌 개체에도 뭔가 추가적인 액션이 필요할 수 있겠습니다. 사람일은 모르는거자나요? 누군가는 저 지형개체에 어떤 face에 물체가 부딪혔는지를 알아야 할수도 있지 않겠습니까? 이 때 intersectrayex 라는 함수를 이용하게 됩니다.
이번에는 intersectray 대신에 intersectrayex 를 사용해 볼 겁니다. 사용방법은 동일하고요. intersectrayEx [node] [ray] 와 같이 사용해 주면 됩니다.
-- intersectray 를 이용하여 지형과 부딪히는 위치를 찾아내자
interResult = intersectrayex tern myRay
-- 어떤 결과가 나왔는지 print 를 이용해서 살펴보자
print(interResult)
-- 결과는?
#((ray [-1.62331,11.1008,1.22501] [-0.382998,-0.128105,0.914823]), 240, [0.383149,0.282177,0.334673])
아까와는 결과가 조금 다르죠? #(oo,oo,oo) 형태로 나온걸 보면 배열로 결과가 나온걸 알 수 있습니다. 총 3개의 리턴값이 나왔는데요.
intersectray 와 마찬가지로 첫번째 결과에는 부딪힌 면의 위치, 방향을 담는 ray 정보가, 두번째에는 어떤 숫자가 나왔고요, 세번째에는 point3 형식으로 좌표가 나왔는데, 딱보니 위에 ray 에 부딪힌 면의 방향이라는 것을 알 수 있겠습니다. 두번째 숫자는 뭐냐고요?
바로 부딪힌 mesh 의 face 인덱스 입니다. 240 번이죠? 바로 저부분에 부딪힌 것 입니다. (이번에는 이동은 하지 않았기 때문에..) 만약 동일하게 이동해야 한다면 배열 안의 개체에서 위치 정보를 뽑아내야 하므로 interResult[1].pos 와 같은 방법으로 부딪힌 면의 위치를 가져오면 됩니다.
이런 기능을 이용해서 부딪힌 면의 색상을 바꾸어 준다거나 해당 face를 삭제하는 등의 기능을 넣을 수 있겠지요? 뭐 레이저총에 맞은 face 가 폭파되며 사라지는 등의... 네.. 그럴때 꼭 필요한 훌륭한 명령어 입니다.
참고로 intersectray 나 intersectrayex 는 mesh 오브젝트에서 정확한 정보를 받아 올 수 있습니다. 가끔 기본 primatine 에 modifier 로 edit_poly 같은것을 씌운 경우에는 동작하지 않을 수 있으니 만약 결과값이 undefined 와 같은 값이 나온다면 검출에 사용된 모델링을 mesh 로 변경한 뒤 (convertTomesh obj) 검사를 진행하시면 됩니다.
끝으로 intersectRayScene 은 위와는 다르게 Ray 가 어떤 개체에 부딪히는지 알수 없을 때 사용합니다.
모두 동일하고 해당 명령만 intersectRayScene 으로 변경해서 돌려볼까요?
interResult = intersectrayScene myRay
요렇게 말이죠. 이번에는 대상을 특정하지 않기 때문에 함수 뒤에 인자가 ray 개체 하나만 들어갔습니다.
요렇게 3개의 개체와 부딪혔다는 정보를 돌려준 것을 알 수 있습니다. 심지어는 본인(sphere) 에도 부딪힌 정보를 돌려 받았다는 것을 알 수 있네요 ㄷㄷㄷ. (저걸 원한건 아닌데) 부딪힌 정보를 보면 역시 내부 정보 역시 배열인데요, 첫번째는 부딪힌 대상 개체, 두번째는 부딪힌 위치정보 (ray 속성) 라는걸 알 수 있습니다.
만약 개체에 어떤 특정할만한 속성이 있다면 해당 개체에 물체를 위치 시킬 수 있습니다.
-- ray 를 생성해 준다
myRay = ray [0,0,0] [0,0,-1]
-- 이동시킬 물체를 지정하자
obj = $Sphere001
-- ray 의 출발 위치를 물체의 중심으로 설정해보자
myRay.pos = obj.pos
-- 위치 검출에 사용될 지형을 지정해보자
tern = $terrain_01
-- intersectray 를 이용하여 지형과 부딪히는 위치를 찾아내자
interResult = intersectrayScene myRay
-- 어떤 결과가 나왔는지 print 를 이용해서 살펴보자
print(interResult)
for i = 1 to interResult.count do
(
testObj = interResult[i][1]
if (findString testObj.name "Box") != undefined then
(
obj.pos = interResult[i][2].pos
)
)
요렇게요.
코드에서는 Box 라는 이름을 포함하는 개체를 만나면 해당 개체에 위치하도록 하는 코드 입니다.
이게 사실 한두개일 때는 간단한 이야기 인데 지면에 위치 시켜야 하는 개체가 수십개 ~ 수백개가 되면 일이 커집니다. 그럴때는 스크립트가 필요한 시점인거죠.
예를 들면 이렇게요..
모두 sphere 라는 이름을 갖고 있기때문에 간단하게 처리할 수 있겠네요. 지면에 닿는 개체는 지면에 닿도록 하고 box 에 닿는 개체는 box 에 위치시키도록 하겠습니다.
sphere 의 중심을 기준으로 하다보니 약간 파뭍히는 대상이 있었는데요, sphere 의 반지름 만큼 위쪽으로 위치하도록 코드를 짜 보겠습니다.
-- ray 를 생성해 준다
myRay = ray [0,0,0] [0,0,-1]
-- 이름이 sphere 로 시작되는 모든 개체를 변수 objs 에 담자.
objs = execute("$Sphere*")
for obj in objs do
(
-- 각 sphere 의 중심점으로 ray 의 위치를 지정함
myRay.pos = obj.pos
-- intersectray 를 이용하여 지형과 부딪히는 위치를 찾아내자
interResult = intersectrayScene myRay
for i = 1 to interResult.count do
(
testObj = interResult[i][1]
if (findString testObj.name "Box") != undefined then
(
obj.pos = interResult[i][2].pos
-- 파묻히지 않도록 반지름 만큼 위로 올림
obj.pos.z += obj.radius
)
else if (findString testObj.name "terrain") != undefined then
(
--- 부딪힌 정보가 terrain 일때 해당 위치로 이동 시킴
obj.pos = interResult[i][2].pos
-- 파묻히지 않도록 반지름 만큼 위로 올림
obj.pos.z += obj.radius
)
)
)
뭐 별거 없죠? 위에서 설명한 것을 반복문만 추가했을 뿐 입니다.
결과는요?
요렇게 예쁘게 안착된 것을 확인 할 수 있습니다.
물론 저는 본 기능을 설명 드리기 위해 위와 같은 예제를 들었지만요. 실제 제가 사용하는 함수에는 몇초만에 수천번 이상 위치를 검출하며 ray 가 사용되는 케이스가 허다분 합니다.
저는 주로 자동으로 모델링을 할때 모델링의 위치, 크기, 배치, 부딪힘, 확장 범위 등을 검사할때 사용하는데요, 이런 검사들을 통해 사람이 손을 데지 않고도 아주 정교한 모델링을 할 수 있는 근간이 됩니다.
참고로 intersectRayScene 의 경우 scene 의 모든 개체에 대하여 검사가 이루어지기 때문에 Scene 내에 아주 많은(수만개 이상의) node 들이 자리잡고 있는 경우에는 속도가 매우 느려질 수 있습니다. 그래서 시작 위치를 기준으로 반경내에 들어오는 대상을 먼저 골라낸 다음 속도가 빠른 intersectRay 를 이용하여 각각 부딪힌 위치를 검출하는 방식으로 사용하고 있습니다. 프로그래밍이라는게 그렇자나요. ㅎ 높은 성능과 효율성을 위해 다양하고 창의적인 방법으로 접근해 가는게 바로 프로그래밍의 묘미이지요.