19일: 원내 지도에서 학습한 철자의 위치 정보 얻기
이번 내용
이번에는 자신의 위치를 기호로 표시한 지도를 만들고 싶다.
이번에 배운 기술은 다음과 같다.
・Room 내 가상 이미지(볼록자)의 위치 정보 얻기
・SetPosition과 SetLocal Position의 차이점(절대 및 상대 좌표)
주요 프로세스
아래의 절차를 통해 지도에 가상 이미지의 위치를 반영하였다.
・공원 내 기준점 2개(왼쪽 앞과 오른쪽 안) 설치
(데이텀 점에 생성된 사각형 영역은 맵에 표시된 영역에 해당합니다.)
・가상 이미지의 위치 정보 얻기
• 기준점에서 가상 이미지의 상대적인 위치를 계산한다
・ 상대 위치를 지도상의 좌표 표시 표시로 변환
유닛 설정
avatar 정보를 가져올 때 Unity를 설정할 필요가 없습니다.
좌표계를 계산하고 표시하는 데 사용되는 객체만 설정합니다.
기준점 2개, 지도 16개, 표시용 표식이 설치되어 있다.
이번에는 다음과 같은 구성으로 제작되었습니다.
태그 객체는 Root 아래에 직접 설정되지 않고 Map의 하위 아래에 설정됩니다.
이렇게 하면 좌표의 변환이 비교적 수월하다는 것을 뒤에 설명할 것이다.
표시 객체의 부모 객체는 X축 방향으로 90도 기울어집니다.
이렇게 되면 표식 대상의 z 좌표축(세로 깊이)은 지도의 Y 좌표(높이)에 해당하기 때문에 Z축→Y축으로 전환하지 않아도 쉽게 이해할 수 있다.
코드 생성
가상 이미지의 위치 정보를 지도에 반영하는 코드를 만듭니다.
아바타계의 함수에 관해서는 아래의 공식 페이지를 보십시오
・ExportAvatar(가상 정보)
실제 제작된 코드는 다음과 같다.function updateAll()
--ルーム内のアバター情報を取得
local avatars = vci.studio.GetAvatars()
--パークの基準点取得&中央座標を算出
local parkMarker1 = vci.assets.GetTransform("ParkAreaMarker 1").GetPosition()
local parkMarker2 = vci.assets.GetTransform("ParkAreaMarker 2").GetPosition()
local parkCenter = (parkMarker1+parkMarker2)/2
--マーカーを一旦全て隠す
for i=1,16 do
local marker = vci.assets.GetTransform("AvatarMarker "..i)
marker.SetLocalPosition(Vector3.__new(0, 0,-500))
end
for index,avatar in pairs(avatars) do
--markerとboneの情報の読み込み
local marker = vci.assets.GetTransform("AvatarMarker "..index)
local bone = avatar.GetBoneTransform("spine")
if bone and marker then
--名前の先頭を取得して表示
local namelead = string.sub(avatar.GetName(),1,1)
vci.assets.SetText("AvatarInitialName "..index,namelead)
--アバターの位置情報の取得&相対位置を計算(相対位置はエリア内にいればー0.5~0.5)となる
local avater_x = (bone.position.x-parkCenter.x)/(parkMarker2.x-parkMarker1.x)
local avater_z = (bone.position.z-parkCenter.z)/(parkMarker2.z-parkMarker1.z)
--mapの端より外にいる場合は端に表示するように調整する
local avaterMarker_x = math.min(math.max(avater_x,-0.5),0.5)
local avaterMarker_z = math.min(math.max(avater_z,-0.5),0.5)
--マーカーを設置する
marker.SetLocalPosition(Vector3.__new(avaterMarker_x, 0.0, avaterMarker_z))
end
end
end
마지막 섹션은 SetPosition이 아니라 SetLocal Position입니다.
SetPosition은 Room의 원점에서 시작하는 절대 좌표이고, SetLocal Position은 부모로부터 온 상대 좌표이다.
상대 좌표에서 모 개체의 왼쪽은 -5.5이고 오른쪽은 0.5입니다.
따라서 원하는 상대 위치를 SetLocal Position에서 직접 설정할 수 있습니다.
(Unity 측면에서 자식 객체로 표시되거나 상위 객체로 표시된 객체를 회전하는 것은 여기를 쉽게 하기 위한 것입니다.)
실제 운행 후 아래와 같다.
사람 위치를 표시하는 안정판 테스트.누가 누군지 아세요?pic.twitter.com/yQ4kUPuref - 마라와 마라(@lightjug)December 25, 2020
보태다
아래의 절차를 통해 지도에 가상 이미지의 위치를 반영하였다.
・공원 내 기준점 2개(왼쪽 앞과 오른쪽 안) 설치
(데이텀 점에 생성된 사각형 영역은 맵에 표시된 영역에 해당합니다.)
・가상 이미지의 위치 정보 얻기
• 기준점에서 가상 이미지의 상대적인 위치를 계산한다
・ 상대 위치를 지도상의 좌표 표시 표시로 변환
유닛 설정
avatar 정보를 가져올 때 Unity를 설정할 필요가 없습니다.
좌표계를 계산하고 표시하는 데 사용되는 객체만 설정합니다.
기준점 2개, 지도 16개, 표시용 표식이 설치되어 있다.
이번에는 다음과 같은 구성으로 제작되었습니다.
태그 객체는 Root 아래에 직접 설정되지 않고 Map의 하위 아래에 설정됩니다.
이렇게 하면 좌표의 변환이 비교적 수월하다는 것을 뒤에 설명할 것이다.
표시 객체의 부모 객체는 X축 방향으로 90도 기울어집니다.
이렇게 되면 표식 대상의 z 좌표축(세로 깊이)은 지도의 Y 좌표(높이)에 해당하기 때문에 Z축→Y축으로 전환하지 않아도 쉽게 이해할 수 있다.
코드 생성
가상 이미지의 위치 정보를 지도에 반영하는 코드를 만듭니다.
아바타계의 함수에 관해서는 아래의 공식 페이지를 보십시오
・ExportAvatar(가상 정보)
실제 제작된 코드는 다음과 같다.function updateAll()
--ルーム内のアバター情報を取得
local avatars = vci.studio.GetAvatars()
--パークの基準点取得&中央座標を算出
local parkMarker1 = vci.assets.GetTransform("ParkAreaMarker 1").GetPosition()
local parkMarker2 = vci.assets.GetTransform("ParkAreaMarker 2").GetPosition()
local parkCenter = (parkMarker1+parkMarker2)/2
--マーカーを一旦全て隠す
for i=1,16 do
local marker = vci.assets.GetTransform("AvatarMarker "..i)
marker.SetLocalPosition(Vector3.__new(0, 0,-500))
end
for index,avatar in pairs(avatars) do
--markerとboneの情報の読み込み
local marker = vci.assets.GetTransform("AvatarMarker "..index)
local bone = avatar.GetBoneTransform("spine")
if bone and marker then
--名前の先頭を取得して表示
local namelead = string.sub(avatar.GetName(),1,1)
vci.assets.SetText("AvatarInitialName "..index,namelead)
--アバターの位置情報の取得&相対位置を計算(相対位置はエリア内にいればー0.5~0.5)となる
local avater_x = (bone.position.x-parkCenter.x)/(parkMarker2.x-parkMarker1.x)
local avater_z = (bone.position.z-parkCenter.z)/(parkMarker2.z-parkMarker1.z)
--mapの端より外にいる場合は端に表示するように調整する
local avaterMarker_x = math.min(math.max(avater_x,-0.5),0.5)
local avaterMarker_z = math.min(math.max(avater_z,-0.5),0.5)
--マーカーを設置する
marker.SetLocalPosition(Vector3.__new(avaterMarker_x, 0.0, avaterMarker_z))
end
end
end
마지막 섹션은 SetPosition이 아니라 SetLocal Position입니다.
SetPosition은 Room의 원점에서 시작하는 절대 좌표이고, SetLocal Position은 부모로부터 온 상대 좌표이다.
상대 좌표에서 모 개체의 왼쪽은 -5.5이고 오른쪽은 0.5입니다.
따라서 원하는 상대 위치를 SetLocal Position에서 직접 설정할 수 있습니다.
(Unity 측면에서 자식 객체로 표시되거나 상위 객체로 표시된 객체를 회전하는 것은 여기를 쉽게 하기 위한 것입니다.)
실제 운행 후 아래와 같다.
사람 위치를 표시하는 안정판 테스트.누가 누군지 아세요?pic.twitter.com/yQ4kUPuref - 마라와 마라(@lightjug)December 25, 2020
보태다
가상 이미지의 위치 정보를 지도에 반영하는 코드를 만듭니다.
아바타계의 함수에 관해서는 아래의 공식 페이지를 보십시오
・ExportAvatar(가상 정보)
실제 제작된 코드는 다음과 같다.
function updateAll()
--ルーム内のアバター情報を取得
local avatars = vci.studio.GetAvatars()
--パークの基準点取得&中央座標を算出
local parkMarker1 = vci.assets.GetTransform("ParkAreaMarker 1").GetPosition()
local parkMarker2 = vci.assets.GetTransform("ParkAreaMarker 2").GetPosition()
local parkCenter = (parkMarker1+parkMarker2)/2
--マーカーを一旦全て隠す
for i=1,16 do
local marker = vci.assets.GetTransform("AvatarMarker "..i)
marker.SetLocalPosition(Vector3.__new(0, 0,-500))
end
for index,avatar in pairs(avatars) do
--markerとboneの情報の読み込み
local marker = vci.assets.GetTransform("AvatarMarker "..index)
local bone = avatar.GetBoneTransform("spine")
if bone and marker then
--名前の先頭を取得して表示
local namelead = string.sub(avatar.GetName(),1,1)
vci.assets.SetText("AvatarInitialName "..index,namelead)
--アバターの位置情報の取得&相対位置を計算(相対位置はエリア内にいればー0.5~0.5)となる
local avater_x = (bone.position.x-parkCenter.x)/(parkMarker2.x-parkMarker1.x)
local avater_z = (bone.position.z-parkCenter.z)/(parkMarker2.z-parkMarker1.z)
--mapの端より外にいる場合は端に表示するように調整する
local avaterMarker_x = math.min(math.max(avater_x,-0.5),0.5)
local avaterMarker_z = math.min(math.max(avater_z,-0.5),0.5)
--マーカーを設置する
marker.SetLocalPosition(Vector3.__new(avaterMarker_x, 0.0, avaterMarker_z))
end
end
end
마지막 섹션은 SetPosition이 아니라 SetLocal Position입니다.SetPosition은 Room의 원점에서 시작하는 절대 좌표이고, SetLocal Position은 부모로부터 온 상대 좌표이다.
상대 좌표에서 모 개체의 왼쪽은 -5.5이고 오른쪽은 0.5입니다.
따라서 원하는 상대 위치를 SetLocal Position에서 직접 설정할 수 있습니다.
(Unity 측면에서 자식 객체로 표시되거나 상위 객체로 표시된 객체를 회전하는 것은 여기를 쉽게 하기 위한 것입니다.)
실제 운행 후 아래와 같다.
사람 위치를 표시하는 안정판 테스트.누가 누군지 아세요?pic.twitter.com/yQ4kUPuref - 마라와 마라(@lightjug)December 25, 2020
보태다
이번 코드는 프레임마다 반영된 처리이기 때문에 무거울 수 있습니다br/>
이 경우 처리할 프레임 사이를 뺄지 또는 한 프레임에 처리할 가상 이미지 수를 결정한 다음 처리를 여러 프레임으로 나누면 가벼워집니다.
덤
위 내용만 보고 놀이기구 위치를 모르기 때문에 놀이기구 위치도 읽어서 표시합니다br/>
놀이기구는 기본적으로 움직이지 않기 때문에 읽을 때만 한 번 처리한다p>
--アトラクション一覧。Unityのオブジェクトの名前を入れる
local attractionList={
"FerrisWheel",
"Carousel",
"ChurrosShop",
"FlightTower",
"HotAirBalloon"
}
--パークの基準点取得&中央座標を算出
local parkMarker1 = vci.assets.GetTransform("ParkAreaMarker 1").GetPosition()
local parkMarker2 = vci.assets.GetTransform("ParkAreaMarker 2").GetPosition()
local parkCenter = (parkMarker1+parkMarker2)/2
for index,attractionName in pairs(attractionList) do
local marker = vci.assets.GetTransform("AttractionMarker "..index)
local attraction = vci.assets.GetTransform(attractionName)
if attraction and marker then
--名前を表示
vci.assets.SetText("AttractionName "..index,attractionName)
--アトラクションの位置情報の取得&計算
local attraction_x = (attraction.GetPosition().x-parkCenter.x)/(parkMarker2.x-parkMarker1.x)
local attraction_z = (attraction.GetPosition().z-parkCenter.z)/(parkMarker2.z-parkMarker1.z)
--mapの端より外にある場合は端に表示するように調整する
local marker_x = math.min(math.max(attraction_x,-0.5),0.5)
local marker_z = math.min(math.max(attraction_z,-0.5),0.5)
--マーカーを設置する
marker.SetLocalPosition(Vector3.__new(marker_x, 0.0, marker_z))
end
end
(아바타와 처리 차이가 많지 않기 때문에 함수로 정리해야 하는데, 이번에는 이해하기 쉽게 그렇게 썼습니다)
끝맺다
어때요?
이번에 시행되지는 않았지만, 아바타를 취득했을 때, 자신이 아바타인지 아닌지를 똑똑히 보면서 자신의 표지 색깔만 바꿀 수 있었다.br/>
다음 회의 내용은 미정이다.
Reference
이 문제에 관하여(19일: 원내 지도에서 학습한 철자의 위치 정보 얻기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/lightjug/items/95db207950d3fd92a423텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)