반응형

주방 청소의 최종보스 렌지후드를 청소하는 방법을 알아보겠습니다.

인터넷에 검색해보면 관련 글이 꽤 보이는 것으로 보아 저뿐만 아니라 많은 분들이 유사한 어려움을 겪고 있다는 것을 쉽게 알 수 있습니다. 

렌지후드에 낀 때는 기름이 증기가 되어 오랜시간 누적되어 쌓인 결과물인데요, 오랜 시간 누적된 만큼 기름기 역시 늘어 붙어 쉽게 제거가 되지 않습니다. 수세미나 청소용 브러쉬에 늘어 붙어 잘 떼어지지 않지요.

오늘 제가 소개해 드릴 방법은 원천적으로 기름을 분해하는 화학적 원리에 따른 것으로 그 동안 제가 시도해본 많은 방안 중 가장 쉽고 효과적인 방안이라 말씀드릴 수 있을 것 같습니다.

 

준비물

  • 가성소다 - 쿠팡에서 구입
  • 렌지후드가 들어갈 만한 크기의 상자 - 다잇소에서 구입

끝 입니다. 

간단하죠? 여기서 가성소다가 나왔는데요. 정식 명칭은 수산화 나트륨, 옛 어른들이 이야기하는 양잿물이기도 하고요, 우리 주변에 흔히 보이는 비누의 주 원료 이기도 합니다.

양잿물, 비누 모두 옷감에 붙어있는 기름때를 제거하기 위하여 사용해 왔던 것들인데요. 역시 수산화 나트륨의 기름 분해 성질을 이용한 것이라 할 수 있겠습니다. 

수산화 나트륨은 강력한 염기성 물질로 단백질을 분해하는 성질이 있기 때문에 피부에 직접 닿게 되면 치명적인 위험한 약품이지만 그 화학적 특성을 알고 잘 사용한다면 매우 뛰어난 청소용 제품임을 알 수 있습니다. 아이들의 손이 닿지 않는 곳에 보관하여야 하며 사용시에는 반드시 주의사항을 숙지하시고 사용하셔야 하겠습니다.

 

렌지 후드를 청소해 볼까나?

길게 설명하기 전에 바로 청소방법을 보여드리겠습니다.

 

전에 쿠팡에서 구입하였던 가성소다(수산화나트룸) 을 꺼냅니다.

 

가성소다!! 두둥, 취급주의 글자가 너무 작다

 

네.. 개인적인 생각으로는 좀 더 무시무시한 경고가 있었으면 합니다. 베이킹소다와 헷갈렸다가는 정말 큰일나니까요.

 

그리고 동네 다있소에 가서 렌지후드가 잠길만한 통을 하나 구입했습니다. 3000원이라는 금액을 주고 커다란 통을 구입했습니다.

 

3000냥이 조금 아깝기는 하지만 안전하고 편안한 청소를 위해 투자했음

 

사이즈는 42cm * 30cm 로 매우 큰 편이지만 가격은 저렴하군요. 플라스틱은 가성소다에 반응하지 않으므로 적당한 플라스틱 통을 구입하시면 됩니다.

 

제가 청소해야할 렌지 후드가 잘 들어가는지 테스트 해봅니다.

 

적당한 크기를 잘 고른듯

 

네 적당합니다.

 

그 다음 세턱용 통을 가지고 베란다로 나갑니다. 수산화 나트륨을 물에 용해 시키면 열과 함께 가스가 분출 되는데요. 매우 고약한 가스이므로 들이마시지 않도록 주의하여 주세요. 마스크를 껴주시면 좋고 눈이나 피부에 직접적으로 쏘이지 않도록 해주시는 것이 좋습니다. 베란다 창문은 환기가 잘 되도록 활짝 열어주시고요.

그 다음 통에 렌지후드가 잠길 만큼 물을 담아준뒤 수산화 나트륨을 3 스푼 정도 넣어 주고 스푼이나 막대로 잘 저어 줍니다. 이 때 반드시 손에는 니트릴 장갑이나 고무장갑을 착용하시기 바랍니다.

그리고 렌지 후드 입수!

 

물이 튀지 않게 살짝 넣어 주자. 수산화 나트륨은 위험한 물질이니까

 

 

물이 튀지 않게 살짝 렌지후드 필터을 담가 봅니다.

이렇게 맑았던 용액이 잠시(불과 몇 초) 후 엔 아래와 같이 변화 됩니다.

 

담그자마자 노란물이 ....
한 10분쯤 경과된 상태

 

 

한 10분 정도 지났으려나요? 사진처럼 투명했던 물은 노랗게 변하고 거품이 무럭무럭 난 상태로 변화되었습니다. 통을 잡고 살살 흔들어 주면 남아있던 기름 때들이 녹아서 떨어지는 것을 볼 수 있는데요. 사실 검은 색으로 굳어버린 기름 때 덩어리가 아니라면 솔질도 한번 할 필요가 없이 싹 제거 됩니다.

이 쯤 되면 무시무시한 수산화나트륨 용액의 악취(라고하기엔 냄새는 거의 없음) 는 거의 없고 빨래비누같은 약간 퀘퀘한 냄새가 나기 시작합니다. 실제로 빨래비누의 주 원료가 수산화 나트륨과 폐 식용유란걸 아시죠? 동일합니다. 우린 비누를 만들건 아니기 때문에 배합이나 온도, 시간 등을 신경쓰지 않았을 뿐 동일한 과정이라 볼 수 있습니다.

이렇게 한 15분 ~ 30분 정도 방치한뒤 주방으로 가져와 물로 행궈주면 청소 끝 입니다. 정말 간단하죠. 중간중간 들러서 때가 잘 떨어지도록 살짝 흔들어 주면 됩니다.

 

이렇게 청소가 완료된 렌지후드 필터와 청소전 필터를 한번 비교해 보도록 하겠습니다.

 

왼쪽은 청소 후, 오른쪽은 청소 전인 다른 필터

 

 

사진에는 잘 나오지 않았지만 왼쪽은 거의 새것 같은 느낌입니다. 현재 청소를 한 왼쪽 필터가 오른쪽 것보다 훨씬 더러웠던 것을 생각하면 정말 놀라운 결과가 아닐 수 없습니다. 

솔질 한번 없이 이렇게 되었으니까요.

 

주방 하수구 거름망도 남은 용액을 이용해 닦아 봤습니다.

 

주방 개수대 거름망에 낀 누런 얼룩
새것처럼 되돌아온 주방 개수대 거름망, 니트릴 장갑 짱.

 

이거 닦아 보신분은 아시겠지만 정말 잘 안닦이죠... 수산화 나트륨이라면 완전 식은죽 먹기 입니다. 다만 이번에 전 렌지 후드 필터를 청소하고 남은 용액을 이용했더니 약효가 떨어져서 인지 칫솔로 살살 좀 문질렀습니다만 처음처럼 강력한 용액 상태였다면 문지를 필요도 없었을 것입니다.

어쨌든 방금 사온 것처럼 깨끗해 졌습니다.

 

청소를 마치며.. 

여기서 제가 드리고 싶은 말은 인터넷상에 떠돌아 다니는 많은 정보가 정말 검증되지 않은 허무맹랑한 정보들이어서 많은 분들께 정신적, 시간적 낭비를 주고 있다는 점 입니다. 대표적인 예가 베이킹소다와 구연산을 섞는 레시피인데요. 화학적으로 둘이 합쳐지면서 베이킹소다의 알칼리성이 갖는 기름때 분해 능력과 구연산이 갖는 산의 특성이 모두 약해지는 중화반응이 일어납니다. 그 과정에서 보여지는 기포가 뭔가 시각적이며 감성적인 효과를 갖게끔 하는 것 같습니다.

잘 이해가 안되는 부분이에요.

구연산의 산성 특성을 이용해 석회 물때를 제거한다거나 베이킹소다의 알칼리성분을 이용해 기름때를 제거하는 것은 이해가 되는데요. 이 둘을 섞어서 산성도 알칼리도 아닌 탄산수를 만들어서 청소를 한다? 흠... 

 

어쨌든 뭐 저 역시 그런 글에 여러차례 낚여본 일반인 중의 하나입니다만 중학교, 고등학교 때 배운 화학을 조금 생각해보니 터무니 없고 바보같은 짓 이었음을 깨닫게 되었습니다.

 

오늘 포스트에서 다룬 수산화 나트륨은 정말 너무너무 강력한 기름때 제거 능력을 갖고 있습니다. 시중에 판매되는 Pb-1 같은 초강력 찌든때 제거제가 결국 비슷한 원료로 만들어진 제품입니다. 락스의 강력한 염기성도 역시 우리 생활에 큰 도움을 주죠. 수산화 나트륨이 매우 위험한 화학약품인것은 분명하지만 그 사용법을 정확히 알고 위험함을 인지하고 사용한다면 너무나 훌륭한 청소용 제품이 아닌가 생각해 봅니다. 사실 수산화 나트륨을 직접 다루는 것이 겁나신다면 트래펑 같은 하수구 막힘을 해결해주는 액체 제품을 사용하셔도 아마 비슷한 결과를 얻으실 수 있으리라 생각됩니다. 모두 강한 염기성을 이용하여 단백질 및 지방을 분해하는 원리를 이용한 것이기 때문입니다.

참고로 수산화 나트륨은 물에 쉽게 희석되며 기름을 녹이고 산화된 물을 중성으로 바꾸는 능력이 있습니다. 이런 성질을 이용해 오염된 (산성화된) 강물을 정화하는 용도로도 사용되기도 하기 때문에 무분별한 사용만 아니라면 환경을 파괴하지 않는 괜찮은 녀석이 되겠습니다. 

인터넷에 보니 과탄산소다와 끊는 물로 기름을 녹여 떼어내는 방법도 많이 소개가 되는데요. 굳었던 찌든 기름때가 높은 온도에서 녹아 다시 액화가 됩니다. 과탄산소다의 활발한 반응 촉진과정에서 기름이 금속에서 떨어져 나오게 되는데요. 이렇게 액화된 기름성분이 완전히 분해가 되지 않으면 배수관등에서 다시 온도가 내려가며 경화가 될 수 있습니다. 결국 기름을 뜨겁게 달궈 그냥 하수구에 버리는 셈 인 것이죠. 환경을 위해서라면 좋은 방법은 아니라고 생각합니다. 

 

끝으로 수산화 나트륨 사용시 주의사항을 한번 더 짚고 넘어가겠습니다. 안전은 중요하니까요.

  • 반드시 환기가 잘 되는 곳에서 물에 희석한다.
  • 가루에 물을 넣으면 안된다. 물에 가루를 넣자. (매우 중요)
  • 희석시 발생하는 기체는 인체에 해롭다. 눈, 코, 입 어디로도 직접적으로 노출되지 않도록 주의 
  • 피부에 직접 닿지 않도록 하자. (락스, 트래펑 모두 동일)
  • 희석 농도가 강하면 매우 높은 열이 발생된다. (김이 펄펄 날 정도)
  • 아이들의 손이 절대 닿지 않는 곳에 보관하자.
  • 금속의 코팅 등 을 부식시킬 수 있으니 오랜시간 금속을 담가두지 말자

이 정도 입니다. 수산화 나트륨은 아주 훌륭한 화학물질이지만 안전사고가 일어나지 않도록 주의하여 사용하시면 그동안 사용하셨던 어떤 세정제보다 깨끗하고 완벽한 청소효과를 얻을 수 있으니 잘 사용하시기 바랍니다. 

 

수산화 나트륨을 직접 사용하시기 꺼려지시면 오븐 클리너 와 같은 제품을 사용하셔도 됩니다. 아래 글 참고 하세요

2021.09.07 - [DIY] - [청소장인] 누렇게 변한 밥주걱, 낡은 가위 새것처럼 닦기 (초간편)

 

[청소장인] 누렇게 변한 밥주걱, 낡은 가위 새것처럼 닦기 (초간편)

당신의 일상에 단 하루도 빠지지 않고 사용하는 물건이 있으신가요? 핸드폰? 지갑? 요즘 재택을 하는 저에게 밥주걱이 그 중에 하나입니다. 밥을 안먹고 살 수는 없으니 밥 주걱은 늘 쓰이는 물

diy-dev-design.tistory.com

 

 

감사합니다.

 

 

2020.03.11 - [청소장인] - 곰팡이와의 전쟁 아파트 베란다 곰팡이 제거하기

 

곰팡이와의 전쟁 아파트 베란다 곰팡이 제거하기

이사를 하며 집을 떠날때도 들어올때도 항상 눈에 밟히는 게 있다면 바로 곰팡이가 아닐까 싶습니다. 떠나는 입장에서는 들어올 사람에게 드는 미안한 마음이겠고 들어갈 입장에서는 내가 살아

diy-dev-design.tistory.com

2020.03.10 - [청소장인] - 욕조 배수구 물빠짐 개선을 위한 리모델링

 

욕조 배수구 물빠짐 개선을 위한 리모델링

'아니 이걸 왜 이렇게 만들어서 물이 안빠지게 말이지...' 라는 생각을 샤워할 때 마다 한 것 같습니다. 욕조 배수구에 보면 머리카락 같은 이물질이 하수도로 흘러 들어가는 것을 막기 위하여 구

diy-dev-design.tistory.com

2020.07.24 - [청소장인] - 철지난 카펫 정리하기, 보관하기 (모셔두는 방법)

 

철지난 카펫 정리하기, 보관하기 (모셔두는 방법)

겨울철 따뜻한 아파트 거실에 푹신한 카페트는 정말 사랑스럽습니다. 포근하고 부드럽죠. 그런데 매년 어김없이 찾아오는 여름이 되면 이녀석이 골칫덩어리가 됩니다. 보관하자니 덩치도 너무

diy-dev-design.tistory.com

2020.12.23 - [청소장인] - [초간단] 철제 욕실 선반 새것처럼 만들기

 

[초간단] 철제 욕실 선반 새것처럼 만들기

아무리 신경쓰고 깨끗하게 관리한다고 해도 살림을 하고 살다보면 손이 닿지 않는 곳이 있고 하나 둘 살림들이 썩어 나가기 시작합니다. 눈에 잘 띄는 것들은 그나마 관리를 해준다고 하여도 어

diy-dev-design.tistory.com

 

2022.06.05 - [DIY] - [수리기]JECROLL , 제크롤 무선 선풍기 수리

 

[수리기]JECROLL , 제크롤 무선 선풍기 수리

무선 선풍기를 선물 받아 사용중인데 JECROLL (제크롤) 이라는 회사의 제품입니다. 뭐 별다를건 없고 그냥 평범한 무선 선풍기 입니다. 10800mAh 정도 되는 배터리용량과 회전, 4단계 스피드 조절, 무

diy-dev-design.tistory.com

 

반응형
반응형

스크립트 초급자든 중급자든 반드시 필요한 것 하나를 꼽으라면 저는 레퍼런스라고 생각합니다. 기존에는 3DS MAX 설치 시에 함께 설치되어 스크립트 작성 창에서 F1 키를 누르면 chm 파일 형식의 레퍼런스 파일이 나타나 간편하게 사용을 했는데요. 언제부터인가 온라인 레퍼런스 사이트로 연결이 되기 시작했습니다.

내용상 큰 차이가 없더라도 매번 인터넷 페이지 안에서 검색하고 찾는 것보다 로컬에 저장되어 있는 chm 파일에서 찾고 검색하는 것이 훨씬 빠르고 쉽기 때문에 전느 chm 포멧의 레퍼런스를 선호하는 편입니다.

사실 autodesk 사이트에도 chm 파일을 배포하고 있는데 굳이 온라인 페이지로 연결 시켰는지 잘 이해가 가지 않는 부분입니다.

 

아래 경로에가시면 chm 형식으로 제작된 최신 레퍼런스 파일을 받으실 수 있으니 참고하시기 바랍니다.

www.autodesk.com/developer-network/platform-technologies/me-sdk-docs-2021

 

Media and Entertainment SDK Docs 2021 | Autodesk Developer Network

The Autodesk Media and Entertainment SDK page offers access to the latest documentation for the 2021 releases of the Autodesk Media & Entertainment SDKs. Use the links below to view the documentation in your browser, or to download the documentation to you

www.autodesk.com

위 페이지에 가셔서 아래 표시해 놓은 링크를 클릭하시면 로컬에 저장해 놓고 사용하실 수 있습니다.

빨간 박스 부분을 클릭하면 다운로드가 가능하다.

 

혹 해당 링크가 깨지는 경우를 대비하여 압축파일로도 업로드 해놓도록 하겠으니 아래 압축파일을 풀어 사용하시면 되겠습니다. 파일 4개를 모두 내려받으신 후 001 번을 압축해제 하시면 됩니다.

3dsmax-2021.1-maxscript-help-chm.zip.001
9.00MB
3dsmax-2021.1-maxscript-help-chm.zip.002
9.00MB
3dsmax-2021.1-maxscript-help-chm.zip.003
9.00MB
3dsmax-2021.1-maxscript-help-chm.zip.004
1.37MB

 

chm 파일은 파일 하나로 완전한 레퍼런스 북 입니다. 웹페이지에 비하여 색인도 훨씬 잘 되어 있고 로딩 시간도 필요치 않으며 오프라인 환경에서도 완벽하게 동작하는 훌륭한 녀석이라 할 수 있습니다.

스크립트 개발에 도움이 되시길 바랍니다.

 

감사합니다. 그럼 이만~

 

2021.03.03 - [DEV/MAX SCRIPT] - [3DS MAXscript] 스크립트 에디터 한글이 ??? 로 나오는 문제 해결 방법

 

[3DS MAXscript] 스크립트 에디터 한글이 ??? 로 나오는 문제 해결 방법

3DS MAX script 는 정말 훌륭한 개발 언어이지만 아쉬운점이 없는 것은 아닙니다. 대표적인 예가 바로 한글지원 문제인데요. 개발 코드 상에 한글이 지원되는건 바라지도 않습니다. 적어도 주석이라

diy-dev-design.tistory.com

2019.12.16 - [DEV/MAX SCRIPT] - 3DS MAX SCRIPT 강좌?? 무작정 시작하기 - 디자이너 추천

 

3DS MAX SCRIPT 강좌?? 무작정 시작하기 - 디자이너 추천

개발이라 하면 두드러기가 나는 디자이너 들이 있습니다. 아니 대부분 그렇죠. 이글을 읽고 계신 본인도 그러하다면, 그런데 스크립트로 무언가를 하고 싶다면 어쩌겠습니까.. 배워야지요. 그래

diy-dev-design.tistory.com

2019.06.12 - [DEV/Adobe Script] - 포토샵 스크립트 레퍼런스, 도움말 사용하기

 

포토샵 스크립트 레퍼런스, 도움말 사용하기

포토샵 스크립트 역시 다른 개발언어와 마찬가지로 도움말이 있습니다. 레퍼런스라고 해야할까요. 사실 개발자라고 해도 모든 명령어와 프라퍼티, 메소드를 외우고 있을 수는 없기 때문에 잘

diy-dev-design.tistory.com

 

반응형
반응형

오늘 갑자기 아내와 함께 장을 보러 나왔다.

나와보니 발에 신겨져 있는 신발은 내 것이 아닌 아들내미 신발이었다.

사실 내 신발과 아들내미 신발은 같은 브랜드의 같은 상품이며 색깔만 다른 동일한 신발이다.  심지어 이 녀석이 불쑥 자라는 바람에 이제는 사이즈까지 동일한... 정말 같은 신발이다. 나는 흰색, 아들 녀석은 검은 색을 신기는 했지만 바로 내 지금 신발의 이전에 신었던 신발이 지금 아들내미가 신는 것과 같은 바로 같은 모델 검은색 신발이었으니 순간 헷갈릴만도 하다 싶었다.

결국 이런일이 있을 줄 알았다면서 웃음짓는 아내의 말은 이해가 간다. 같은 브랜드의 같은 신발이니 그럴 수 있겠지.

그런데

내 발에 신겨져 있는 신발은 내가 매일 신어왔던 바로 그 같은 신발이 아니었다. 위에서 말한 것처럼 색상만 다를 뿐 같은 브랜드에 같은 제품임에도 불구하고.. 발에 닿는 감촉 하나 하나가 낯설었다. 나올때는 몰랐지만 걸을때마다 느껴지는 그 낯설움같은 느낌? 어릴때 아빠의 구두를 신고 마당을 거닐때 만큼이나 낯설은 발의 감촉.

 

기껏해야 30분정도, 내 것이 아닌 신발을 신으며 재미 있는 느낌을 받았다.

공장에서 똑같은 가죽으로 똑같은 공정에 의해 똑같은 사이즈로 만들어낸 신발일 것인데 내가 신어왔던 신발과 아들내미의 신발은 왜 이다지도 다른것일까.

사람의 발모양이 다르면 얼마나 다르길레 .... 

어쩌면 나에게 완벽하게 맞추어진 세계에서 아주 조금만 다른 세계로 바뀌어가도 이렇게나 어색하고 불편한것은 비단 우리의 삷의 전반을 보지 않아더라도 작은 신발에서도 느낄 수 있다는 것을 오늘 새삼스레 느꼈달까?

이런 나의 안정된 삶의 주변에 있는 가족들, 직장 동료들 역시 너무나 익숙하게 스며들어 있는 것은 아닐까 하는 생각도 들었다.

주변인들에게 감사하고 내 가족에게 한번더 감사하는 마음을 보내본다.

이제 사춘기에 접어든 아들이 익숙한 그 느낌의 펜스를 넘지 않기를 바라본다.

 

 

 

 

반응형
반응형

3DS MAX script 는 정말 훌륭한 개발 언어이지만 아쉬운점이 없는 것은 아닙니다. 대표적인 예가 바로 한글지원 문제인데요. 개발 코드 상에 한글이 지원되는건 바라지도 않습니다. 적어도 주석이라도 한글이 되면 좋은데 막상 작성할때는 작성이 되지만 저장하고 다시 열어보면 한글로 된 문자는 모두 ??? 로 표시되는 문제가 있습니다.

오늘 포스트에서는 주석으로 남긴 한글 문자열이 ??? 로 나타나는 경우 해결 방법을 알려드리려고 합니다.

 

먼저 3DS MAX 를 실행하신 뒤 상단 메뉴에서 

Scripting > Max Script Editer 를 열어 줍니다.

그러면 아래와 같이 뭔가 잔뜩 작성되어 있는 설정 파일이 열리게 됩니다.

 

여기서 code.page 를 검색하신 후 아래와 같이 작성합니다.

code.page=949

이렇게 하고 저장하신 뒤 3DS Max 를 재실행 하시면 주석이 한글로 잘 보이는 것을 확인하실 수 있습니다.

물론 이렇게 해도 코드 상의 한글은 인식하지 못하니 참고바랍니다.

 

감사합니다.

 

2021/02/24 - [DEV/MAX SCRIPT] - 3DS MAX 스크립트, 프라퍼티 와 매소드 이해하기

 

3DS MAX 스크립트, 프라퍼티 와 매소드 이해하기

오늘은 3DS MAX script 를 개발하면서 이해하면 도움이 될 용어 두가지를 설명 드릴까 합니다. 바로 property 와 method 입니다. 프라퍼티와 매소드 정도로 발음하시면 됩니다. 도대체 이게 뭐고 왜 이런

diy-dev-design.tistory.com

2021/02/26 - [분류 전체보기] - [3ds max script] vector 에 대하여

2019/12/16 - [DEV/MAX SCRIPT] - 3DS MAX SCRIPT 강좌?? 무작정 시작하기 - 디자이너 추천

 

3DS MAX SCRIPT 강좌?? 무작정 시작하기 - 디자이너 추천

개발이라 하면 두드러기가 나는 디자이너 들이 있습니다. 아니 대부분 그렇죠. 이글을 읽고 계신 본인도 그러하다면, 그런데 스크립트로 무언가를 하고 싶다면 어쩌겠습니까.. 배워야지요. 그래

diy-dev-design.tistory.com

 

반응형
반응형

안녕하세요. 오늘은 디자이너라면 조금 생소할 수 있는 vector 라는 개념에 대하여 소개해 드릴까 합니다.

혹시 작년 쯤인가요? 슈퍼밴드라는 밴드 오디션 프로그램에서 F=ma 라는 곡으로 아주 인기를 끌었던 적이 있습니다. 이식은 노래 가사에도 나오듯이 F (힘) = mass (질량) * accelation (가속도) 라고 정의를 하고 있습니다. 즉 힘이라는 개념은 단순한 한가지 속성이 아닌 두가지 속성이 합쳐져서 만들어진 개념인 것이죠.

오늘 소개해 드릴 vector (벡터) 가 바로 그러 합니다. vector 는 딱히 우리말로 번역된 문구가 있는지 모르겠지만 그냥 vector 로 이해하시는 것이 빠를 것 같습니다.

먼저 벡터를 간단하게 정의하자면

Vector = Direction (방향) * length (거리) 

라고 할 수 있습니다.

벡터의 정의

 

만약 [0,10,10] 이라는 벡터가 있다면 방향은 [0.0,1.0,1.0] 거리는 10 인 벡터라는 것이죠.

방향을 나타내는 point3 좌표의 x, y, z 값에 length 인 10을 각각 곱해주면 [0,10,10] 이라는 벡터가 만들어 지는것이죠.

여기서 길이의 속성을 뺀 순수한 방향을 normal vector 라고 합니다. x, y, z 의 값이 1.0이 넘지 않도록 정규화한 값인데요. 벡터를 이용할때 매우 자주 사용되는 개념이므로 잘 이해하셔야 합니다.

 

먼저 벡터의 표현을 볼까요?

3DS MAX script 에서는 [ x , y , z ] 와 같은 point3 좌표와 동일한 형태로 표현합니다.

max script 에서 point3는 점의 좌표이기도 하지만 [ 0 , 0 , 0 ] 으로 부터의 방향과 거리가 담긴 벡터이기도 한것이죠.

두 점 사이의 벡터를 구하는 방법은 아래와 같습니다. 점 A 로부터 점 B 까지의 벡터는 아래와 같습니다.

vector = pointB - pointA

벡터의 표현

어떤 점 P1 로부터 어떤 점 P2 까지의 벡터가 있다고 했을때 그 방향으로 지정한 거리만큼 이동된 제 3의 좌표를 구하려면 normal vector 가 필요합니다. max script 에서는 nomalize 라는 명령어로 vector 에서 방향 성분만 추출된 normal vector 를 얻을 수 있습니다.

먼저 두 점을 이용하여 vector 를 구하는 방법은 위에서 소개한 바와 같이 아래와 같이 스크립트로 표현됩니다. 

vec_p1p2 = p2 - p1

vec_p1p2 = p2 - p1

간단하죠? 도착점의 좌표에서 시작점의 좌표를 빼주면 됩니다. 

그리고 normal vector 를 구하는 방법은 아래와 같습니다.

normalVec_p1p2 = normalize(vec_p1p2))

 

요렇게 하면 normalVec_p1p2 라는 변수에 구해진 벡터의 노멀라이징된(정규화된) 벡터를 얻을 수 있습니다.

 

우리가 이제 방향을 알았다면 해당 방향으로 이동된 어떤 거리의 점의 위치를 얻을 수 있습니다.

구하는 방법은 아래와 같습니다.

최종 위치 = 시작위치 + (방향 * 거리)

벡터를 이용한 점의 위치 계산 방법

그림으로 보면 이런식입니다.

위에서 사용했던 스크립트를 이용해보면 

distance = 100

vec_p1p2 = p2 - p1

normalVec_p1p2 = normalize(vec_p1p2))

resultPos = p1 + (normalVec_p1p2 * distance )

이렇게 되겠죠.

Distance 가 - 가 되면 반대 방향으로 이동을 하게 됩니다.

Distance 를 p1 과 p2 사이의 거리를 구한다음 절반에 해당하는 거리를 부여하면 두 점사이의 중간에 해당하는 지점의 위치를 구할 수 있습니다. 

2021/02/24 - [DEV/MAX SCRIPT] - 3da max script 점과 점 사이의 거리 구하기

 

3da max script 점과 점 사이의 거리 구하기

간단하게 포스팅을 남기려고 합니다. 제목 그대로 버텍스 간 거리 구하기 입니다. 아니 정확히는 두개의 point3 사이의 거리를 구하는 방법을 소개해 드릴까 합니다. 그리고 용용 편으로 두 점사

diy-dev-design.tistory.com

이런식으로 두점 사이를 일정 간격으로 등분 할때도 사용할수 있고요. 

물체의 거리, 방향들을 바꾸어 주면서 연속해서 변화를 줄 경우 간단하게 2D 자동차 게임 같은 것을 만드는게 가능한거죠. 가속 페달 버튼을 누르면 매 프레임 당 이동하는 거리를 바꾸어 주면 되고 좌우 핸들 방향을 조절하면 normal vector 의 방향을 바꾸어 주면 됩니다.

방향과 길이를 조정하면서 이동된 점의 위치

이해 되시나요? 

 

사실 공간상의 이동 및 좌표 계산에 vector 는 빠질 수 없는 개념입니다.

 

 

 

예를 들어 세 점의 각도를 구해봅시다. 2D 좌표 안에서 각도를 구하는 것은 중학교 수학 정도를 잘 배웠다면 직접 계산 하는 것도 가능하긴 합니다. 그럼 3D 에서는요? 그냥 생각해도 쉽지 않겠죠 ?

그래서 max script 간단하게 세점의 각도를 구하는 방법을 소개해 드릴까 합니다.

p1
p2 -- 축이 되는 점
p3

vec01 = normalize ( p2 - p1 )
vec02 = normalize ( p2 - p3 )

angle = acos( dot (vec01, vec02))

이렇게 하면 간단하게 angle 을 구할 수 있습니다.

수많은 점을 가지고 있는 곡선 (폴리라인)의 점을 minimalize (단순화) 할 경우에도 연속된 세점의 각도를 측정하고 지정한 각도 미만일 경우 점을 삭제 하여 단순화 하는 기능에 적용할 수 있으며 지면으로 부터의 현재 벡터의 각도 등을 측저한다든가 하는 여러가지 응용을 할 수 있습니다.

 

벡터를 알면 어떤 직선에 수직이 되는 방향도 쉽게 구할 수 있습니다.

vecA = normalize ( p2 - p1 )

vecA1 = [ vecA.y , - vecA.x , vecA.z ]

--또는 

vecA2 = [ - vecA.y , vecA.x , vecA.z ]

와 같이 하면 vecA1 과 vecA2 는 vecA 의 수직이 되는 벡터가 되는데요 vecA1 과 vecA2 에 - 가 붙은 위치가 다른데 각각 기준이 되는 벡터의 오른쪽 과 왼쪽 벡터가 됩니다.

이는 직선의 방정식을 생각해보면 단순한 원리임을 알수 있습니다.

직선에 수직 성분을 갖는 다른 직선 --> 수직 벡터로 응용할 수 있다

어떤 직선을 기준으로 양쪽으로 확장되는 두께 등을 다이나믹하게 설정해야 하는 경우, 예를 들면 라인을 폴리곤으로 변경할 때 유용하게 사용될 수 있습니다.

기준이 되는 벡터의 양쪽으로 확장할 때 사용 가능

 

벡터를 응용함에 있어 중요한

벡터의 합

벡터의 합

 

응용을 해보면 직선상의 3점을 이용하여 어떤 점이 중간에 있는 점인지 알아내는 것에도 vector 연산을 이용하면 쉽게 할 수 있습니다.

점 A, B, C 가 있다고 했을 때 선분 AB, AC 또는 선분 BA, BC 등을 구해서 노멀 벡터를 구한 뒤 두개의 노멀 벡터를 더했을 때 [0,0,0] 이 나오면 해당 점이 중간에 있는 점인 것이죠. 

 

이상으로 간단하게 3DS Max 에서 사용되는 벡터의 개념에 대하여 알아 보았습니다. 

추가가 필요하다고 판단되는 내용이 생각나면 업데이트 하도록 하겠습니다.

문의하실 내용이 있으시면 뎃글로 남겨주시면 감사하겠습니다.

 

그럼 이만

 

2021/02/26 - [DEV/MAX SCRIPT] - [3ds max script] 카메라 생성, 이동 시키기

 

[3ds max script] 카메라 생성, 이동 시키기

오늘 다룰 주제는 맥스의 카메라 와 뷰포트 입니다. 3D 공간의 개체를 보여주기 위하여는 카메라 라고 하는 가상의 개체가 필요합니다. 카메라에 보여지는 대상을 이미지화 하여 사용자에게 보

diy-dev-design.tistory.com

2021/02/24 - [DEV/MAX SCRIPT] - 3da max script 점과 점 사이의 거리 구하기

 

3da max script 점과 점 사이의 거리 구하기

간단하게 포스팅을 남기려고 합니다. 제목 그대로 버텍스 간 거리 구하기 입니다. 아니 정확히는 두개의 point3 사이의 거리를 구하는 방법을 소개해 드릴까 합니다. 그리고 용용 편으로 두 점사

diy-dev-design.tistory.com

2019/12/16 - [DEV/MAX SCRIPT] - 3DS MAX SCRIPT 강좌?? 무작정 시작하기 - 디자이너 추천

 

3DS MAX SCRIPT 강좌?? 무작정 시작하기 - 디자이너 추천

개발이라 하면 두드러기가 나는 디자이너 들이 있습니다. 아니 대부분 그렇죠. 이글을 읽고 계신 본인도 그러하다면, 그런데 스크립트로 무언가를 하고 싶다면 어쩌겠습니까.. 배워야지요. 그래

diy-dev-design.tistory.com

 

 

 

 

 

반응형
반응형

오늘 다룰 주제는 맥스의 카메라 와 뷰포트 입니다.

3D 공간의 개체를 보여주기 위하여는 카메라 라고 하는 가상의 개체가 필요합니다. 카메라에 보여지는 대상을 이미지화 하여 사용자에게 보여주는 것(랜더링) 인데요. 실제 카메라가 있는 건 당연히 아니고 카메라라는 개념을 담은 것이죠.

일반적인 뷰포트 역시 가상의 카메라라고 할 수 있는데 화면을 보여주는 방식, 다시말하면 3D 공간의 개체를 랜더링 하는 방식에 따라 크게 orthogonal 또는 perspective 로 나눌 수 있습니다. 

이러한 카메라와 뷰포트를 다루는 예제를 몇가지 오늘 소개해 드릴까 합니다.

 

타겟 카메라 생성하고 위치 설정하기.

물론 카메라를 max UI 를 이용하여 수동으로 생성할수 있지만 스크립트 공부 중이므로 자동으로 생성해 봅니다. 수동으로 카메라를 설정하게 되면 손으로 생성한 뒤 z 축으로 이동하거나 타겟의 위치를 조정해 주어야 하지만 자동으로 생성하면 항상 원하는 각도와 위치에 생성할 수 있답니다.

예를 들면

Teapot01 이라는 개체가 있다고 했을 때 항상 카메라를 XY 평면에서 우하단, Z 위치로 약간 위에서 보는 각도에서 보도록 만들어 줄 수 있습니다. 어쩌면 Teapot 의 크기가 크건 작건 항상 적당한 위치에 생성하는 것도 가능하겠죠. 아래 코드를 봐주세요.

obj = $Teapot01

-- 타겟 카메라를 생성한다.
myCamera = Targetcamera fov:45  pos:[0,0,0] target:(Targetobject transform:(matrix3 [1,0,0] [0,1,0] [0,0,1] [0,0,0]))
myCameraTarget = myCamera.Target 

-- 대상물의 크기에 따라 카메라 위치를 자동으로 설정해 주기 위하여 tepot 의 radius 를 얻어 온다.
teapotRadius = obj.radius
	
-- 카메라의 위치를 티팟의 우하단으로 위치하고 위로 높이를 조정한다. 
myCamera.pos = [teapotRadius * 4, teapotRadius * -4, teapotRadius * 3] 

-- 카메라 타겟의 위치를 티팟의 중앙으로 설정한다.
myCameraTarget .pos = obj.pos 
	
-- 타겟이 너무 바닥에 있으므로 radius 만큼 올려준다.
myCameraTarget .pos.z += teapotRadius 
	

이렇게 해주고 실행하면 (ctrl+E) 카메라가 하나 자동으로 생성되는 것을 볼 수 있습니다.

자동으로 생성된 카메라

만약 Teapot 이 엄청 크거나 작더라도 아마 비슷한 각도에 생성이 될겁니다.

훨씬 큰 teapot 을 생성하였지만 역시 유사한 각도에 카메라가 생성되었다.

동일한 스크립트로 실행 하였지만 역시 teapot 에 묻히지 않는 위치에 카메라가 생성이 되었습니다.

각도와 거리까지 완전히 동일하게 만들 수도 있지만 약간 복잡한 코드가 필요하므로 나중에 설명 드리겠습니다.

 

 

카메라 회전하기!

카메라 개체 역시 node 에 속하므로 rotate, move 와 같은 일반적인 속성을 제어할 수 있습니다.

그런데 오늘 제가 소개해 드릴 코드는 조금 다릅니다. 

카메라를 대상 피사체가 될 오브젝트를 중심으로 빙글 돌릴 겁니다.

흔히 제품 랜더링 할때 많이 쓰일 법한 샷 인데요. 보통은 물체를 돌려서 360도 촬영을 합니다. 그런데 드라마 씬 처럼 카메라를 빙글 돌려야 한다면요? 손으로 예쁘게 돌게 세팅하기가 쉽지 않습니다. 

자 그럼 어떻게 해야 할까요?

 

중심은 타겟의 위치로 하겠습니다. 회전은 한바퀴 할거고요. 제가 소개해드릴 코드를 이용하면 한바퀴를 돌며 10장을 찍을 수도 있고 100장을 찍을 수도 있습니다.

여기서 삼각함수가 필요한데요.. 음.. 삼각함수라 하면 sin(),  cos() 기억 나시나요? 기억 안나시죠? 

sin 이 0~90 으로 가는동안 값은 0.0 ~ 1.0 으로 변하고요. cos 가 0 ~ 90 으로 가는동안 값은 1.0 ~ 0.0 으로 변한다는 것만 정확하게 기억하시면 됩니다. 또 90에서 180 까지 가는동안은 그 반대의 값이 됩니다.

sin 그래프를 보면 아래와 같습니다.

sin 함수의 그래프

저 구불 구불한 그래프 기억나시나요? 아직 안나신다고요?

네... 기억 못하셔도 상관 없고요. sin cos 을 붙여서 원을 그릴 수 있다는 것만 기억하시면 됩니다.

 

sin cos 을 이용하여 원을 그리는 방법

바로 이렇게요.

 

이해 되시나요? 

 

그래서 우리는 맥스에서 360도를 돌면서 sin cos 에서 받아지는 값에 카메라에서 타겟까지의 거리를 곱해주면 카메라가 원 운동을 하게 되겠죠.

코드를 한번 보실까요?스에서 360도를 돌면서 sin cos 에서 받아지는 값에 카메라에서 타겟까지의 거리를 곱해주면 카메라가 원 운동을 하게 되겠죠.

-- 아까 만들어 두었던 카메라를 이용하겠습니다.
myCamera = $Camera01
myCameraTarget = myCamera.Target 


center = myCameraTarget.pos
distanceFromCam = myCamera.targetDistance

-- 사진을 찍을 랜더링 장 수
step = 12

for xx = 0 to step do
(
          -- sin cos 를 이용하여 원형으로 회전된 위치를 각 단계마다 계산한다.
          camXpos = sin(360.0 / step * xx) * distanceFromCam
          camYpos = cos(360.0 / step * xx) * distanceFromCam
		
          -- 실제 카메라의 위치를 계산된 위치로 설정한다.
          myCamera.pos.x = center.x + camXpos
          myCamera.pos.y = center.y + camYpos
		
          -- 랜더링하여 이미지로 저장한다
          render camera:myCamera outputSize:[320, 240] vfb:false outputfile:("D:\\testRender" +(360.0 / step * xx) as string + ".png" )
)

코드에 생소한 개념 (ventor)이 들어가긴 했지만 크게 어렵지는 않습니다.  위에서 설명 드린 것처럼 sin cos 를 이용하여 카메라의 위치를 설정하고 매 프레임마다 랜더링을 해주는 스크립트 입니다. 

vector 와 render 에 대한 부분은 나중에 별도로 포스팅을 하도록 하겠습니다. 

이렇게 자동으로 랜더링된 이미지를 한번 볼까요? 

12 프레임으로 나누어 랜더링된 이미지들

 

저 코드의 step 개수만큼 랜더링이 되었는데요. 해당 숫자를 24로 하든 36 으로 하든 아니면 360으로 필요하신 만큼 변경하여 랜더링 하여도 아마 잘 랜더링이 될 것 입니다.

에니메이션 등을 주고 임의로 사용자가 회전하는 위치에 따라 랜더링을 한다는건 사실상 엄청나게 귀찮고 힘든 작업이므로 랜더 세팅만 잘 되었다면 이렇게 걸어 놓고 자고 오면 깔끔하게 원하는 만큼 랜더링이 되어 있을 거에요.

 

그럼 선택한 물체로 카메라를 이동 시키는 방법은? 

네.. 간단하죠. 선택한 물체의 pos 를 이용해서 target 을 이동 시키고 이동시킨 만큼 카메라도 이동시키면 됩니다.

objs = getCurrentselection()
obj = objs[1] -- 선택한 오브젝트

myCam = $Camera01
myCam_target = myCam.target

-- 선택한 오브젝트 까지 이동할 거리 
delta = obj.pos - myCam_target.pos

myCam_target.pos += delta
myCam.pos += delta

이렇게 하면 되는 것이죠. 이동할 거리 (delta) 를 구한뒤 타겟과 카메라의 위치에 더해주면 됩니다.

아주 간단하죠?

 

 

타겟은 그대로 두고 카메라 거리만 조정하는 방법

3DS Max 의 타겟 카메라에서 타겟 까지의 거리를 조정하면 카메라는 가만히 있고 타겟만 움직이지 않습니까? 그런데 이게 영 불편할때가 있습니다. 타겟은 가만히 두고 distance 를 조정하여 카메라를 움직이고 싶을때가 있지요.

스크립트로 한번 해당 기능을 만들어 볼까요?

myCam = $Camera01
myCam_target = myCam.target

-- 현재 카메라로부터 타겟까지의 거리
currentDistance = myCam.targetDistance 

-- 이동할 거리 (상대거리)
deltaDist = 50

-- 타겟으로 부터 카메라의 방향
vecCam = normalize(myCam.pos - myCam_target.pos)

--최종 이동될 위치
finalCamPos = myCam.pos + (vecCam * deltaDist)

myCam.pos = finalCamPos

역시 간단합니다. 아직 vector 개념이 없으신 분은 중간에 잘 이해가 안되는 부분이 있으실 텐데요. 역시 나중에 별도로 포스팅하도록 하겠습니다.

deltaDist 값을 음수를 넣게되면 카메라의 위치가 타겟 방향으로 가까워 질겁니다.

위의 코드에 deltaDist 를 바꾸어 테스트를 해본 모습입니다.

물론 UI 에서 이런 기능을 지원하기는 하지만 정확한 거리를 이동하기 위하여는 스크립트 만큼 정확하고 편리한 것이 없기 마련입니다.

 

 

그외의 기능들

물론 카메라의 각종 프라퍼티를 스크립트를 이용하여 조정하는 것도 가능합니다.

orthoProjection 을 true 또는 false 로 설정하여 원근감을 없애고 isomatric 이미지 처럼 만든다거나

FOV 를 조정한다거나 near, far range 를 변경하거나 하는 등의 변경은 아주 쉽습니다.

F1 키를 누르시고 camera 를 검색하시면 친절하게 설명이 되어 있답니다.

 

이상으로 카메라 관련한 스크립트 소개를 마치도록 하겠습니다.

 

감사합니다.

2022.05.31 - [DEV/MAX SCRIPT] - [3ds max script] ray 에 대하여 알아보기

 

[3ds max script] ray 에 대하여 알아보기

가끔 아니 어쩌면 자주 3D 공간안에서 물체의 위치를 지정할때 이 물체가 저쪽에 닿는 면에 딱 위치하고 싶은데... 할때가 있죠? 예를 들면 나무나 돌덩이 이런걸 랜덤하게 막 생성한 다음 굴곡진

diy-dev-design.tistory.com

2021/02/24 - [DEV/MAX SCRIPT] - 3DS MAX 스크립트, 프라퍼티 와 매소드 이해하기

 

3DS MAX 스크립트, 프라퍼티 와 매소드 이해하기

오늘은 3DS MAX script 를 개발하면서 이해하면 도움이 될 용어 두가지를 설명 드릴까 합니다. 바로 property 와 method 입니다. 프라퍼티와 매소드 정도로 발음하시면 됩니다. 도대체 이게 뭐고 왜 이런

diy-dev-design.tistory.com

2020/04/29 - [DEV/MAX SCRIPT] - 3DS MAX 스크립트로 개체 선택하기

 

3DS MAX 스크립트로 개체 선택하기

Max Script 를 이용하여 무엇인가를 하려면 필수 요소라고 할 수 있는 것 중의 하나가 개체를 선택하거나 지정하는 방법입니다. 여기서 개체는 3D Scene 안의 오브젝트, 스플라인, 헬퍼 등과 같은 사

diy-dev-design.tistory.com

2019/12/11 - [DEV/MAX SCRIPT] - 3DS MAX 스크립트로 초간단 다이얼로그 창 , UI 버튼 만들기

 

3DS MAX 스크립트로 초간단 다이얼로그 창 , UI 버튼 만들기

3DS MAX 스트립트를 이용하여 스크립팅을 하기 시작하면 MAX 로 할 수 있는 일이 너무나 많고 빠르게 진행된다는 것을 알 수 있게 됩니다. 이 놀라운 기능들을 스크립트를 매번 실행시키는 것이 번

diy-dev-design.tistory.com

 

 

반응형
반응형

어제 아이오닉 온라인 공개 라이브 방송을 봤습니다.

음...

현대차가 이제 본격적으로 칼을 갈고 있구나... 하는 마음 한 켠에는 아쉬운 마음이 사라지지 않는데요.

바로 왜건을 향한 저의 마음이랄까요? ㅋㅋ

이번에 나온 아이오닉5 의 경우 너무 예쁜 컨셉카 같은 디자인으로 선보일 것 같은데요. 뭔가 아쉬움이 남는 모습입니다.

 

먼저 현대차가 아이오닉5 디자인 공개 초기부터 컨셉으로 줄창 외쳤던 포니의 디자인을 볼까요?

네.. 요즘 분들은 전혀 모르시겠지만 바로 오늘의 현대자동차가 존재 할 수 있었던 이유. 포니 입니다.

솔직히 지금봐도 바퀴가 조금 작고 위아래로 약간 통통한것을 제외하면 어디내놔도 부끄럽지 않은 멋진 디자인을 가지고 있습니다. 비율도 그러하고요, 뭔가 차량이 주는 감성적인 디자인의 맛이란게 살아있는 차량이랄까요?

그럼 이번에 공개된 아이오닉5 차량을 볼까요?

아이오닉5

네... 디자인적으로 당연히 기존 포니에 비하여 완성된 모습입니다만... 슈팅브레이크 같은 포니의 모습에 비하면 뭔가 폭스바겐 골프가 떠오르는 차체비율이라던가... 최근의 핫해치 같은 느낌이 다분합니다. 

현대차는 차량 휠베이스가 3미터에 달한다며 자랑을 해는데요... 차량 높이가 1.6미터에 이르는 것을 보면 거의 SUV 만큼이나 큰 덩치의 실내공간을 보여주겠군요.

개인적인 생각으로는 이번 아이오닉에서 volvo 의 v90 이나 아우디의 a6 allroad, 벤츠의 슈팅브레이크 같은 차량에서 느껴지는 그 감성적인 멋짐을 놓친것은 아닌가 생각됩니다.

왜건 형태의 차량을 사랑하는 저로써는 ... 글쎄요.. 에휴..

 

그래서 그냥 낙서를 해보았습니다. 제 마음속의 아이오닉을 그려본 거죠. ㅋㅋ

한 두가지 트림이 더 나왔으면 하는데요. 그 중 첫번째는 바로 슈팅 브레이크 컨셉입니다. ㅋ (정확히는 그냥 5door 라고 해야할까요? ㅎ)

내가 타고싶은 아이오닉5 5door (실제로 이런차 없으니 오해하지 말길)

휠 베이스는 그대로 두고 트렁크 적재 공간을 조금 늘린 뒤 차고를 조금 낮췄습니다. 물론 전기차 배터리 적재 공간이 바닥에 있으니 기존 차량에 비하면 바닥면 높이가 조금 높긴 하겠지만 뭐 그냥 저의 낙서고 바람이니까요.. 

옆면의 드라마틱한 대각선 디자인도 빼버렸습니다. 자동차가 제 일상이지 전시장은 아니잖아요? 전 너무 튀는 디자인을 좋아하는 편은 아니어서요... 

음 그리고 이번 아이오닉보다 C필러 가 바짝 누워있는 모습이 오히려 포니의 디자인 정체성과 잘 맞는 것은 아닌가 생각해 봅니다.

테슬라가 인기가 있는 이유가 현대차처럼 어마어마한 실내 공간을 뽑아냈기 때문일까요? 뭔가 휠베이스를 늘리고 커다란 타이어를 장착시킨것 까지는 감성적인부분을 확 자극하다가 그놈에 실내 공간이 다 망친 느낌이 들더라고요.

 

 

 

아이오닉이 왜건으로 나온다면???

그리고 다음으로는 제가 사랑하는 왜건 모델입니다.

내가 타고싶은 아이오닉5 왜건 (실제로 이런차 없으니 오해하지 말길)

ㅋㅋ 어떠신가요? i40 이후로 종적을 감춘 현대 자동차의 왜건이 이렇게 다시 태어나 준다면 바로 구입하고 말고요. 네.. 고민할 것도 없습니다. 전 바로 구입할거에요.

현대차에서는 휠베이스 3 미터를 이야기하며 펠리세이드 보다 넓은 실내 공간을 보여준다고 했었나요? ㅎ 그럼 왜건 모델로 나온다면 당연히 만족할만한 실내공간 일 겁니다. 게다가 여유있는 트렁크 공간까지 ...

여기에 루프박스도 한번 얹어 보았습니다. 

저 처럼 차량의 목적이 단순히 이동수단 또는 자랑거리라고 생각지 않습니다. 가족을 위한 다목적 이동수단이 가장 비슷한 설명일 것 같은데요.. 그러기 위해서는 루프박스는 필수겠지요.

뭔가 간지 폭풍 루프박스인 툴레의 Motion XT Alpine을 얹어 봤습니다 

내가 타고싶은 아이오닉5 왜건 (실제로 이런차 없으니 오해하지 말길)

와.. 진짜 괜찮지 않습니까?

휠베이스는 건드리지 않았는데도 차체를 조금 낮추고 트렁크 공간을 조금 확보 했을 뿐인데 저같은 왜건 매니아에게는 확 와닿는 디자인이 아닐까 생각됩니다.

솔직히 volvo v90이랑 비교해도 저라면 저만의 아이오닉5 왜건에 한표 던질 것 같습니다 ㅎ

 

원 차량에 비하여 변경된 부분을 보면

전장은 4664 -->  4849 , 차고는 1605 --> 1476 으로 변경되었는데요. (이미지 상)

개인적인 생각으로는 차량이 꼭 저렇게 높은 차고를 가져야 하나 하는 생각입니다. 전 SUV 의 차량 비율이 정말 별로거든요. 아우디 A6 allroad 같은 실용적이면서 스타일만큼은 어디 내놔도 뒤쳐지지 않는 국산 차량이 꼭 나와 줬으면 하는 소망이 있습니다. (참고로 a6 allroad 의 차고는 1455 입니다)

전장은 뭐... 그렇게 큰편은 아니지요? 참고로 audi a6 allroad quatro 가 4951 이니 4849 정도면 너무 크지도 작지도 않은 덩치라 할수 있겠습니다. 물론 아이오닉5가 휠베이스를 넓게 잡아 주었기에 저 크기에 저건 비율이 가능한것이긴 합니다. (차량은 작지만 a6 보다 휠베이스는 길지요 ㅋ)

 

어쨌든.. 그래도 자랑스런 국산 차의 자존심인 현대차가 전기차 전용 플랫폼으로 완전히 새로운 차를 선보였습니다. 저 역시 응원하는 바이며 전기차 부문에서 테슬라를 이길 수 있는 날이 오기를 바라면서, 그리고 저같은 왜건 매니아를 등지지 않기를 바라면서 이런 하소연 같은 포스팅을 남겨 봅니다. 

사실 누가관심이나 갖겠나 싶으면서도 아쉬운 마음에 글을 끄적이게 되네요.

 

그럼 이만 포스팅을 마칩니다.

 

2020/06/18 - [DESIGN] - 현대차에서 이런 왜건 차량이 나온다면 ?

 

현대차에서 이런 왜건 차량이 나온다면 ?

대한민국은 정말 왜건 차량의 무덤인것 같습니다. 저는 개인적으로 해치백이나 왜건 형태의 차량을 선호합니다. 스포티해 보이기도 하고 실용적이기도 하지요. 실제로 트렁크가 달려있는 세단

diy-dev-design.tistory.com

2020/06/19 - [DESIGN] - 쏘나타에 관한 고찰 - 새로운 디자인 ???

 

쏘나타에 관한 고찰 - 새로운 디자인 ???

나의 어릴쩍 기억부터 줄곧 내 머릿속에 자리매김하고 있는 특이한 차를 손꼽을때 빼 놓을수 없는 차중의 하나가 바로 현대 자동차의 소나타가 아닐까 생각됩니다 처음 소나타가 출시되었을때

diy-dev-design.tistory.com

 

 

반응형
반응형

간단하게 포스팅을 남기려고 합니다. 

제목 그대로 버텍스 간 거리 구하기 입니다. 아니 정확히는 두개의 point3 사이의 거리를 구하는 방법을 소개해 드릴까 합니다. 

그리고 용용 편으로 두 점사이의 어떤 특정 위치의 점의 좌표를 구하는 방법도 함께 알려 드리도록 하겠습니다.

어떤 물체가 점 A 로 부터 점 B 까지 움직이거나 A,B 사이의 특정위치를 알기 위한 계산을 하려면 필수적인 연산인데요.

예를들면 점 A 와 점 B 의 한 가운데가 되는 위치, 또는 점 A 로부터 점 B 까지의 0.2 정도 의 위치를 계산 하는 방법을 소개해 드릴까 합니다.

 

 

점과 점사이의 거리 구하기

점과 점 사이의 거리는 max script 에서는 아주 간단하게 구할 수 있답니다. 기본 명령어가 있기 때문인데요.

 

그림과 같이 박스 2개가 있는 경우 정 가운데 새로운 박스를 하나 만들어야 할 경우 사용하면 됩니다.

물론 저는 예를 box 로 들었지만 개체 A 의 어떤 점과 개체 B 의 어떤 점 사이의 위치를 구할때 동일하게 사용할 수 있는 예제 입니다.

boxA = $Box01
boxB = $Box02

ptA = boxA.center
ptB = boxB.center

distAB = distance ptA ptB -- 두점 사이의 거리를 계산한다.

간단하져?

distance 라는 명령을 이용하여 간단하게 두 점 사이의 거리를 구할 수 있습니다.

 

이제 정 가운데의 위치를 알아 볼까요?

공간상에서 위치를 이동시킨 값을 얻는 방법은 아래와 같습니다.

  • 최초 시작위치 + (이동할 방향 * 이동할 거리)

여기서 이동할 방향은 vector 라는 생소한 개념인데요. 나중에 설명을 드리도록 하겠습니다. 일단 vector 라고 하면 방향+거리 라고 간단하게 생각하시면 되겠습니다.

위의 예제를 활용하여 정중앙의 위치를 찾아보겠습니다.

boxA = $Box01
boxB = $Box02

ptA = boxA.center -- boxA 의 중앙 위치 (point3)
ptB = boxB.center -- boxB 의 중앙 위치 (point3)

distAB = distance ptA ptB -- 두점 사이의 거리를 계산한다.

-- 두점 사이의 정 가운데 위치를 찾아보자.
-- ptA --> pt2 방향으로 distAB / 2 한만큼 이동한 위치를 찾아보자

vector = ptB - ptA -- ptA -> ptB 방향 : ptB - ptA

vector = normalize(vector) -- normalize 를 이용하여 벡터(방향+거리) 에서 거리 개념을 제거한다.

ptC = ptA + (vector * (distAB / 2)) -- 시작위치 + (방향 * 이동할 거리)
	
boxC = box()
	
boxC.pos = ptC -- 새로 만들어진 boxC 의 위치를 구해진 정중앙으로 변경

 

요렇게 실행해 보면 아래와 같이 새로운 박스가 생성 됩니다.

가운데 녹색 박스가 두개의 박스 정 중앙에 생성되었다.

 

네 간단하죠? 실제로 제가 아주 많이 사용하는 계산 식으로 사용자 함수로 만들어 놓고 사용한답니다. 물론 정중앙이 아닌 1/3 지점, 아니면 어떤 위치도 설정이 가능합니다.

-- ptA --> pt2 방향으로 ratio 한만큼 이동한 위치를 돌려주는 함수
fn getPointBy2Point ptA ptB ratio =
(
	distAB = distance ptA ptB
	vector = normalize(ptB - ptA) -- 벡터(방향+거리) 에서 거리 개념을 제거한다.
	ptC = ptA + (vector * (distAB / 2)) -- 시작위치 + (방향 * 이동할 거리)		
	return ptC
)

 

이런식으로 만들어서 사용하는데요. 실제 사용할 때는 아래와 같이 사용하게 됩니다.

-- ptA --> pt2 방향으로 ratio 한만큼 이동한 위치를 돌려주는 함수
fn getPointBy2Point p1 p2 ratio =
(
	distAB = distance p1 p2
	vector = normalize(p2 - p1) -- 벡터(방향+거리) 에서 거리 개념을 제거한다.
	p3 = p1 + (vector * (distAB * ratio)) -- 시작위치 + (방향 * 이동할 거리)		
	return p3
)


boxA = $Box01
boxB = $Box02

ptA = boxA.center
ptB = boxB.center

ptC = getPointBy2Point ptA ptB 0.75 -- 위에서 작성된 함수를 이용하여 간단히 위치 계산

boxC = box()
boxC.pos = ptC

실행해 보면 두 박스 사이의 0.75 정도의 위치에 새로운 박스가 생성된 것을 알 수 있습니다.

 

위에서 만들어 놓은 함수를 이용하여 점 A 로부터 점 B 방향으로 1.0 이 넘으로 B 보다 더 멀리에 위치한 점을 얻을 수 있고요. 코드를 조금 수정하면 ratio 대신 직접 거리를 넣는 것도 간단히 구현할 수 있습니다.

 

공간상의 자동화 작업을 할 때 아주 자주 사용되는 기능이므로 저처럼 함수로 만들어 놓고 사용하셔도 좋겠습니다.

 

이만 오늘의 포스팅을 마치도록 하겠습니다.

 

 

반응형
반응형

오늘은 3DS MAX script 를 개발하면서 이해하면 도움이 될 용어 두가지를 설명 드릴까 합니다.

바로 property 와 method 입니다. 프라퍼티와 매소드 정도로 발음하시면 됩니다.

도대체 이게 뭐고 왜 이런걸 설명하는 걸까요? 

사실 몰라도 그만이기는 하지만 본격적으로 스크립트 개발을 하시려면 이해하고 넘어가시면 도움이 될 것 같아 작성하기로 마음 먹었습니다.

 

Property - 속성, 어떤 개체가 가지고 있는 속성을 가져오거나 변경한다.

Method - 명령, 어떤 개체에 대하여 일반적으로 필요한 여러가지 기능을 수행하도록 명령을 보낸다.

이라고 쉽게 생각하시면 됩니다. 실제 의미와는 조금 차이가 있긴 하지만 어쨌든 위와 같이 이해하시면 크게 다르지는 않습니다.

 

Property

일반적으로 프라퍼티는 어떤 클래스의 속성을 정의하는 지시어 입니다. 예를 들면

obj = $Box01

obj.Height -- 모델링의 높이, 읽고 쓰기 가능
obj.Width -- 모델링의 가로 폭, 읽고 쓰기 가능
obj.Length -- 모델링의 세로 폭, 읽고 쓰기 가능

obj.pos.x -- 모델링의 x 위치 , 읽고 쓰기 가능
obj.pos.y -- 모델링의 y 위치 , 읽고 쓰기 가능
obj.pos.z -- 모델링의 z 위치 , 읽고 쓰기 가능

obj.max.x -- 모델링의 바운드 박스 (공간 영역)중 가장 큰 x 위치 , 읽기만 가능
obj.max.y -- 모델링의 바운드 박스 (공간 영역)중 가장 큰 y 위치 , 읽기만 가능
obj.max.z -- 모델링의 바운드 박스 (공간 영역)중 가장 큰 z 위치 , 읽기만 가능

obj.min.x -- 모델링의 바운드 박스 (공간 영역)중 가장 작은 x 위치 , 읽기만 가능
obj.min.y -- 모델링의 바운드 박스 (공간 영역)중 가장 작은 y 위치 , 읽기만 가능
obj.min.z -- 모델링의 바운드 박스 (공간 영역)중 가장 작은 z 위치 , 읽기만 가능

와 같이 정의 했을 때 Height 나 Width, Length 는 Box() 라는 클래스(엄연히 말하면 pos, max 는 node 클래스의 프라퍼티 임)의 속성(프라퍼티)이 됩니다. 대부분의 경우 read/wright 가 지원되지만 경우에 따라서는 read 만 지원되는 경우도 있습니다. 무슨 말인가 하면 read 만 지원된다 하면 해당 프라퍼티를 불러올 수 는 있지만 사용자가 변경하지는 못한다는 뜻입니다. Height 나 width, length 는 변경이 가능하죠? 한번 해보세요.

 

 

Methode

method 는 명령이라고 말씀 드렸는데요. 보통 클래스를 만들때 해당 클래스를 제어할 수 있는 여러가지 기능을 한꺼번에 만들게 됩니다. 맥스 스크립트에서는 프라퍼티와 매소드를 굳이 크게 구분하고 있지는 않지만 엄연히 개념적으로 다르므로 이해하시면 좀 더 복잡한 스크립트 코딩에 도움이 됩니다.

대표적으로 editable_poly  같은 클래스를 컨트롤 하기 위한 polyop 라는 오퍼레이션 전용 클래스가 있는데 해당 클래스에 getvert 와 setvert 가 있습니다.
getvert 는 polygon 모델링의 특정 vertex 의 위치를 받아오는 기능이며 setvert 는 특정 버텍스의 위치를 설정(변경) 해주는 기능입니다. getvert 는 사실 프라퍼티에 가까운 기능이지만 setvert 는 분명 매소드처럼 동작 되는 것이죠.
맥스스크립트에서는 get/set 이 대부분 쌍으로 존재합니다.

obj = $ -- editabel poly

pt = polyop.getvert obj 1 -- 1번 버텍스의 위치를 가져온다.
pt.z += 10 -- 가져온 위치의 z 값을 +10 해준다
polyop.setvert obj 1 pt -- +10 된 위치를 다시 원래 버텍스에 세팅한다.

위의 예제는 polyop 라는 폴리곤 전용 오퍼레이션 매소드를 이용하여 버텍스의 좌표를 변경하는 대표적인 간단한 사례 입니다.

for 구분과 연계하여 아래와 같이 할 수도 있죠.

obj = $ -- editabel poly

vNum = polyop.getnumverts obj -- 버텍스의 개수를 가져온다.

for i = 1 to vNum do
(
	pt = polyop.getvert obj i -- i 번쨰 버텍스의 위치를 가져온다.
	pt.z += 10 -- 가져온 위치의 z 값을 +10 해준다
	polyop.setvert obj i pt -- +10 된 위치를 다시 원래 버텍스에 세팅한다.
)

 

물론 editable poly 자체가 가지고 있는 method 와 property 도 있습니다.

obj = $ -- editabel poly

obj.selectByMaterial  1 -- select by material id 1

위의 코드는 머테리얼 ID 1번인 모든 폴리곤을 선택해주는 기능(method) 가 되겠습니다. 뒤의 숫자를 바꿔주면 해당 머테리얼 ID 가 적용된 모든 폴리곤이 선택이 되겠죠.

 

 

맥스 스크립트에서 언급되는 개체는 상위 / 하위 개념을 가지고 있습니다. 이는 일반적으로 계층구조의 프로그래밍을 할때 보여지는 구조인데요. 상위 클래스 > 하위 클래스와 같은 형태인데 하위 클래스는 상위 클래스의 프라퍼티와 매소드를 상속 받아 동일하게 사용할 수 있습니다.

 

맨위의 사례에서 보여드린 .pos 라든가 .max .min 같은 프라퍼티가 대표적인 예인데요, 이는 node 라는 3ds max 의 최상위 클래스를 상속했기 때문입니다.

node 라는 클래스는 우리가 알고 있는 선택가능한 거의 모든 대상이 포함되며 이는 geometry 뿐만 아니라 shape 이나 helper, camera 까지도 모두 node 의 하위 클래스 입니다.

즉 node 클래스에서 정의하고 있는 모든 속성 및 명령을 해당 하위 클래스에서도 사용이 가능한 것입니다.

스크립트 개발하실때 가장 많이 참고하는 것이 바로 help 파일인데요. help 파일 (3ds max script reference)의 특정 개체에 대한 페이지 (예를 들면 editable mesh) 에 나와 있지 않더라도 해당 개체가 node 클래스의 하위 클래스라면 node 클래스에서 정의한 모든 속성과 기능을 사용할 수 있다는 것이죠.

 

How to use

프라퍼티나 매소드는 보통은 아래와 같이 사용됩니다.

클래스.명령어 -- 위에서 보여드렸죠?

명령어 <클래스> -- 실제로는 이런 경우가 많습니다.

위에서 말씀드린 node 클래스의 property/methode 들을 볼까요? 

F1 키를 누르신 뒤 검색 창에 node 를 쳐보시면 node 개체에 대하여 상세하게 설명이 되어 있습니다.

move <node> <point3> -- mapped
scale <node> <point3> -- mapped
rotate <node> <angle> <axis_point3> -- mapped -- angle in degrees
rotate <node> <quat> -- mapped
rotate <node> <eulerangles> -- mapped

이런식으로 사용되는 것이죠. 

앞의 move, scale 등은 node 에 사용할 수 있는 method 라고 할 수 있겠습니다.

말하자면 

명령어 <오브젝트> 옵션

이런 경우가 대부분이고 자주 사용됩니다.

 

 

자 간단하게 설명을 드렸지만 개념에 대한 부분이므로 어려울 수 있습니다.

솔직히 몰라도 스크립트 개발에는 큰 영향은 없습니다. 하지만 개자이너로 거듭나기 위하여 이정도 개념은 가지고 있어야 하지 않겠습니까? ㅋ 개발자들 눈이 동그라미가 될거에요.

끝으로 맥스 스크립트의 node 계층 구조를 간단하게 보여드리겠습니다. reference 에서 Hierarchy를 검색 하시면 max script 의 모든 계층 구조를 보실 수 있답니다.

Value
--MAXWrapper
----node   
------camera  
--------Freecamera 
--------Missing_Camera 
--------Targetcamera 
------GeometryClass  
--------Apollo_Param_Container 
--------apolloParamContainer 
--------Blizzard 
--------BoneGeometry 
--------BoneObj 
--------Boolean2 
--------Box 
--------C_Ext 
--------Capsule 
--------ChamferBox 
--------ChamferCyl 
--------Cone 
--------Conform 
--------Connect 
--------ControlContainer 
--------CV_Surf 
--------Cylinder 
--------Damper 
--------Editable_mesh 
--------Editable_Patch 
--------Editable_Poly 
--------EditablePolyMesh 
--------Gengon 
--------GeoSphere 
--------Hedra 
--------Hose 
--------L_Ext 
--------Loft 
--------LoftObject 
--------Mesher 
--------meshGrid 
--------Missing_GeomObject 
--------Morph 
--------Nurbs 
--------NURBS_Imported_Objects 
--------NURBSSurf 
--------OilTank 
--------OldBoolean 
--------PArray 
--------particleMesher 
--------PCloud 
--------Plane 
--------Point_Surf 
--------Point_SurfGeometry 
--------PolyMeshObject 
--------Prism 
--------Pyramid 
--------Quadpatch 
--------RingWave 
--------RmModel 
--------RmModelGeometry 
--------Scatter 
--------ShapeMerge 
--------SlidingDoor 
--------SlidingWindow 
--------Snow 
--------Sphere 
--------Spindle 
--------Spray 
--------Spring 
--------SuperSpray 
--------Targetobject 
--------Teapot 
--------Terrain 
--------Torus 
--------Torus_Knot 
--------TriMeshGeometry 
--------Tripatch 
--------Tube 
------helper  
--------Anchor 
--------AudioClip 
--------Background 
--------Billboard 
--------Bone 
--------BoxGizmo 
--------CamPoint 
--------Compass 
--------Cone_Angle 
--------ConeAngleManip 
--------CylGizmo 
--------Dummy 
--------Falloff_Manipulator 
--------FalloffManip 
--------FogHelper 
--------grid 
--------Hotspot_Manip 
--------HotspotManip 
--------IK_Chain_Object 
--------IK_Swivel_Manip 
--------IKSwivelManip 
--------Inline 
--------LOD 
--------Missing_Helper 
--------NavInfo 
--------Plane_Angle 
--------PlaneAngleManip 
--------Point 
--------PointHelperObj 
--------Position_Manip 
--------PositionManip 
--------Protractor 
--------ProxSensor 
--------radiusManip 
--------Reactor_Angle_Manip 
--------Reactor_Vector_Handle_Manip 
--------ReactorAngleManip 
--------ReactorVectorHandleManip 
--------Rotation_--
--------Rotation_Valuehelper 
--------RotationValueManip 
--------Slider_Manip 
--------SliderManip 
--------sliderManipulator 
--------Sound 
--------SphereGizmo 
--------Tape 
--------TimeSensor 
--------TouchSensor 
--------uvwMappingHeightManip 
--------uvwMappingLengthManip 
--------uvwMappingUTileManip 
--------uvwMappingVTileManip 
--------uvwMappingWidthManip 
------light  
--------Directionallight 
--------freeSpot 
--------Missing_Light 
--------Omnilight 
--------TargetDirectionallight 
--------targetSpot 
------NodeObject  
------shape  
--------Arc 
--------Circle 
--------CV_Curve 
--------CV_Curveshape 
--------Donut 
--------Ellipse 
--------Helix 
--------line 
--------LinearShape 
--------Lines 
--------Missing_Shape 
--------Ngon 
--------NURBSCurveShape 
--------Point_Curve 
--------Point_Curveshape 
--------Rectangle 
--------section 
--------Simple_Shape 
--------Simple_Spline 
--------SplineShape 
--------Star 
--------text 
------SpacewarpObject  
--------BendModWSM 
--------Bomb 
--------CameraMapSpaceWarp 
--------ConformSpaceWarp 
--------Deflector 
--------Drag 
--------gravity 
--------MapScalerSpaceWarp 
--------Missing_WSM_Object 
--------Motor 
--------Path_Follow 
--------PathDeformSpaceWarp 
--------PBomb 
--------PDynaFlect 
--------PDynaflector 
--------POmniFlect 
--------PushSpaceWarp 
--------SDeflector 
--------SDynaFlect 
--------SDynaflector 
--------SOmniFlect 
--------SpaceBend 
--------Spacedisplace 
--------SpaceFFDBox 
--------SpaceFFDCyl 
--------SpaceNoise 
--------Spaceripple 
--------SpaceSkew 
--------SpaceStretch 
--------SpaceTaper 
--------SpaceTwist 
--------Spacewave 
--------UDeflector 
--------UDynaDeflector 
--------UDynaFlect 
--------UOmniFlect 
--------Vortex 
--------Wind 
------System  
--------Bones 
--------Missing_System 
--------Ring_Array 
--------Sunlight 
--------XRefObject 

그럼 이만 오늘 포스팅을 마칩니다.

감사합니다.

 

2020/04/29 - [DEV/MAX SCRIPT] - 3DS MAX 스크립트로 개체 선택하기

2019/12/11 - [DEV/MAX SCRIPT] - 3DS MAX 스크립트로 초간단 다이얼로그 창 , UI 버튼 만들기

2019/06/01 - [DEV/MAX SCRIPT] - 3DS MAX Script 에 대하여

반응형

+ Recent posts