"광원 이펙트 활용과 응용"이라는 게시글을 접하게 되었습니다.
그리고 광원 관련 컴포넌트에 대하여 관심이 생겨 연구를 해봤습니다.
사실, 연구라기 하기 거창하고, 그냥 좀 막 만져보고 관련하여 좀 적어보려 합니다.
이번 글에서는 그 중, 스포트라이트 컴포넌트에 대하여 다뤄보려 합니다.


스포트라이트는 특정지점을 강하게 비추는 역할을 하는 광원입니다.
빛이 평면에 닿으면 주로 원형의 형태로 나타나며, 밝기에 따라 3구역으로 나눌 수 있습니다.
  밝은 영역 : 조도가 거의 일정한 안쪽 원 내부영역
  감쇠 영역 : 조도가 급격하게 감소하는 영역
  어두운 영역 : 광원에 의한 조도가 없는 영역, 바깥쪽 원형 외부영역

스포트라이트의 주요 속성은 위치와 방향입니다.
세부적인 속성은 물리학, 조명학, 3D그래픽 툴 등에 따라 조금씩 다른거 같습니다.
필자는 이 모두 잘 모르므로 컴포넌트의 값을 변경하며 귀납적으로 얻은 결과를 토대로 작성합니다.

스포트라이트 컴포넌트와 아래와 같은 형태로 되어 있습니다. 예시입니다.
        {
          "type": "SpotLightDefinitionComponent",
          "name": "spotlight_Entity_SpotLightDefinition",
          "color": {
            "x": 1.0,
            "y": 1.0,
            "z": 1.0
          },
          "power": 3000.0,
          "angle": 30.0,
          "distance": 50.0,
          "attenuation": 4.0,
          "shadowCaster": false,
          "lightMask": 1,
          "isLocalLight": false,
          "diffuseContribution": 1.0,
          "specularContribution": 1.0
        }

color : x, y, z순으로 rgb값을 나타냄, 각 값은 1을 넘기지 않도록 주의
power : 일률, 전력, 전위시간당 에너지
  값이 높으면 빛이 강해짐
  같은 power에서 거리가 멀어지면, 조도는 거리 제곱에 비례하여 감소
  같은 power에서 입체각(soild angle)이 넓어지면, 조도는 입체각에 비례하여 감소
angle : 입체각, 3차원에서 쓰는 각, 그냥 2차원으로 생각해도 됨
  값을 키우면 평면상의 빛의 면적이 증가함
distance : 도달거리, 물체가 도달거리보다 멀면 빛을 거의 받지 않음
attenuation : 감쇠인자
  값이 커지면 밝은 영역과 어두운 영역간의 밝기차이가 커짐
  0으로 두면 두 영역간 밝기차이가 거의 없으며, 광원의 효과가 거의 사라짐
diffuseContribution : 빛의 퍼짐정도, 난반사의 정도
  0으로 두면 광원의 효과가 거의 사라짐
specularContribution : 빛 정반사의 정도
  값을 내리면 물체 등의 빛반사가 감소함
shadowCaster, lightMask, isLocalLight
  필자는 잘 모름, 3D 광원쪽 인듯, 아는분 설명 부탁드립니다

스포트라이트 컴포넌트를 설명했지만 정작 주요속성인 위치, 방향은 없습니다.
그냥 스포트라이트 컴포넌트만 쓰면 기본위치(0, 0, 0)에서 기본방향(+z)으로 빛을 쏩니다.
따라서, 유의미하게 사용하려면 변환 컴포넌트를 함께 사용해야 합니다.
위치는 "position", 방향은 "orientation"으로 변경해줘야 합니다.
포지션은 대충 뭔지 아실것이고, "orientation"은 값을 변경하면 축회전을 통해 방향을 변경해줍니다.
x, y, z축을 중심으로 회전시키는 듯 하며, w는 잘 모르겠습니다.
3차원 회전에 대하여 알아야 활용이 가능하며, 모르면 그냥 막 대입하시거나 알려진 값을 사용하시면 됩니다.
변환 컴포넌트는 많이 본 이것입니다.
        {
          "type": "TransformDefinitionComponent",
          "name": "component_transform1",
          "position": { "x": 0.0, "y": 0.0, "z": 0.0 },
          "orientation": { "x": 0.0, "y": 0.0, "z": 0.0, "w": 1.0 },
          "scale": { "x": 1.0, "y": 1.0, "z": 1.0 },
          "inheritOnlyPosition": false
        }

내용을 정리하자면, 스포트라이트 컴포넌트를 사용하는 경우,
변환 컴포넌트에 의해 설정된 위치에 보이지 않는 광원이 설치되며, 설정된 방향으로 빛이 나갑니다.
power을 키우면 빛이 강해지고, angle을 키우면 원형 빛의 넓이가 증가합니다.
distance가 물체의 위치보다 짧으면 빛이 안보이므로 잘 조절하셔야 합니다.
주변과 스포트라이트 지점을 명확하게 강조하려면 attenuation값을 키우시면 됩니다.
왠지 눈이 아프다 싶으시면 specularContribution을 낮추시면 좀 나아집니다.

오브젝트 등에 스포트라이트를 적용하려면 아래 형태의 코드를 추가하시면 됩니다. 예시입니다.
오브젝트(0, 0, 0)기준으로 35만큼 위에 스포트라이트를 설치하고 아래로 빛을 쏴주는 코드입니다.
    {
      "type": "Entity",
      "name": "entity_spotlight",
      "id": 2353308128,
      "components": [
        {
          "type": "TransformDefinitionComponent",
          "name": "entity_TransformDefinition",
          "position": {
            "x": 0.0,
            "y": 35.0,
            "z": 0.0
          },
          "orientation": {
            "x": 0.707106769,
            "y": 0.0,
            "z": 0.0,
            "w": 1.0
          },
          "scale": {
            "x": 1.0,
            "y": 1.0,
            "z": 1.0
          },
          "inheritOnlyPosition": false
        },
        {
          "type": "SpotLightDefinitionComponent",
          "name": "spotlight_Entity_SpotLightDefinition",
          "color": {
            "x": 1.0,
            "y": 1.0,
            "z": 1.0
          },
          "power": 2500.0,
          "angle": 20.0,
          "distance": 80.0,
          "attenuation": 5.0,
          "shadowCaster": false,
          "lightMask": 1,
          "isLocalLight": false,
          "diffuseContribution": 1.0,
          "specularContribution": 0.5
        }
      ]
    }

개인보관함에 적용했던 샘플파일은 아래 위치로 이동 되었습니다.


하찮은 글 읽어주셔서 감사합니다.
제가 전문 지식이 있는게 아니라서 이상하거나 틀린 부분이 있을겁니다.
제가 아는 부분은 거의 다 적었으므로 질문주셔도 큰 도움이 되는 답변 어려운 점 양해 바랍니다.