VE Lua Documentation

Press F to search!

quatFromDir

Definition


-- @/lua/common/mathlib.lua:1108

function quatFromDir(dir, up)
  local tmp = newLuaQuatxyzw(0, 0, 0, 1)
  tmp:setFromDir(dir, up)
  return tmp
end

Callers

@/lua/ge/extensions/editor/tech/roadArchitect/junctions.lua
  local height = groundDist / tan(halfFov) + zMax + 5.0                                             -- The height that the camera should be to fit all the trajectory in view.
  local rot = quatFromDir(vec3(0, 0, -1))
@/lua/ge/extensions/editor/tech/roadArchitect/groups.lua
  gView:set(0.0, -r * auditionPlanarDistFac, auditionHeight + r * auditionElevationFac)
  local gRot = quatFromDir(auditionVec - gView)
  commands.setFreeCamera()
  auditionCamPos:set(x * c - y * s, x * s + y * c, gView.z)
  local gRot = quatFromDir(auditionVec - auditionCamPos)
  core_camera.setPosRot(0, auditionCamPos.x, auditionCamPos.y, auditionCamPos.z, gRot.x, gRot.y, gRot.z, gRot.w)
  local height = groundDist / tan(halfFov) + zMax + 5.0                                             -- The height that the camera should be to fit all the trajectory in view.
  local rot = quatFromDir(vec3(0, 0, -1))
@/lua/ge/extensions/core/recoveryPrompt.lua
      if veh then
        spawn.safeTeleport(veh, veh:getPosition(), quatFromDir(veh:getDirectionVector()), nil, nil, nil, nil, false )
        local invVehId = career_modules_inventory.getInventoryIdFromVehicleId(target.vehId)
        else
          spawn.safeTeleport(veh, veh:getPosition(), quatFromDir(veh:getDirectionVector()), nil, nil, nil, nil, true )
        end
@/lua/ge/extensions/career/modules/inventory.lua
    pos = camPos,
    rot = quatFromDir(bbCenter - camPos),
    filename = filename,
      local model, config = "covet","vehicles/covet/covet_tutorial.pc"
      local pos, rot = vec3(-24.026,609.157,75.112), quatFromDir(vec3(1,0,0))
      local options = {config = config, licenseText = "TUTORIAL", vehicleName = "TutorialVehicle", pos = pos, rot = rot}
@/lua/ge/extensions/editor/crawlEditor/missionPortTool.lua
          if direction:length() > 0.001 then
            rotation = quatFromDir(direction, vec3(0, 0, 1))
            log('D', logTag, string.format("Calculated start rotation pointing to first checkpoint (distance: %.2f)", direction:length()))
@/lua/ge/extensions/editor/vehicleEditor/liveEditor/veFlexbodyDebug.lua
  local refPos = vEditor.vdata.nodes[vEditor.vdata.refNodes[0].ref].pos
  local rotInv = quatFromDir(-vEditor.vehicle:getDirectionVector(), vEditor.vehicle:getDirectionVectorUp()):inversed()
  local vertPosLocal = rotInv * flexbodyObj:getDebugVertexPos(chosenVertID) + refPos
@/lua/ge/spawn.lua
    pos = veh:getPosition()
    rot = quatFromDir(veh:getDirectionVector(), veh:getDirectionVectorUp())
  end
          -- Find the rotation that puts the vehicle correctly in the driving direction
          rot = quatFromDir(drivingDir * legalSide * roadSide, n1.normal)
          break
      pos = n1.pos
      rot = quatFromDir(n1.pos - n2.pos, n1.normal)
    end
    pos = veh:getPosition()
    rot = quatFromDir(veh:getDirectionVector(), veh:getDirectionVectorUp())
  end
@/lua/ge/extensions/editor/tech/roadArchitect/roads.lua
  local height = groundDist / tan(halfFov) + zMax + 5.0                                             -- The height that the camera should be to fit all the trajectory in view.
  local rot = quatFromDir(vec3(0, 0, -1))
  gView:set(0.0, 30.0, auditionHeight + 15.0)
  local gRot = quatFromDir(auditionVec - gView)
  commands.setFreeCamera()
  auditionCamPos:set(x * c - y * s, x * s + y * c, gView.z)
  local gRot = quatFromDir(auditionVec - auditionCamPos)
  core_camera.setPosRot(0, auditionCamPos.x, auditionCamPos.y, auditionCamPos.z, gRot.x, gRot.y, gRot.z, gRot.w)
@/lua/ge/extensions/gameplay/rally/loop/rallyLoopManager.lua
    local rotVec = vec3(rot)
    local rotQuat = quatFromDir(rotVec)
    -- Apply rotation correction (same as moveTo node)
@/lua/ge/extensions/gameplay/rally/tools/loopToolbox.lua
  --     local pos = center + rot * vec3(0, -15, 0)
  --     local camRot = quatFromDir(center - pos)
  --     core_camera.setPosRot(0, pos.x, pos.y, pos.z, camRot.x, camRot.y, camRot.z, camRot.w)
  --     local pos = center + rot * vec3(0, -15, 0)
  --     local camRot = quatFromDir(center - pos)
  --     core_camera.setPosRot(0, pos.x, pos.y, pos.z, camRot.x, camRot.y, camRot.z, camRot.w)
@/lua/ge/extensions/editor/objectTool.lua
        local scl = obj:getScale()
        local rot = quatFromDir(rayCastInfo.normal)
        local mtx = MatrixF(0)
@/lua/ge/extensions/editor/raceEditor/pathnodes.lua
    if editor.getAxisGizmoAlignment() == editor.AxisGizmoAlignment_Local then
      local q = quatFromDir(node.normal, vec3(0,0,1))
      rotation = QuatF(q.x, q.y, q.z, q.w)
  if node.normal then
    self.beginDragRotation = deepcopy(quatFromDir(node.normal, vec3(0,0,1)))
  end
    if hovered.normal then
      self.beginDragRotation = deepcopy(quatFromDir(hovered.normal, vec3(0,0,1)))
    end
      local sp = data.self.path.startPositions:create(nil, data.spid or nil)
      sp:set(data.pos, quatFromDir(data.normal):normalized())
      sp.name = node.name .. " Recovery " .. (reverse and "Reverse" or "Forward")
@/lua/ge/extensions/editor/mapSensorEditor.lua
  local s = sensors[selectedSensorIdx]
  beginDragRotation = quatFromDir(s.dir, s.up)
end
    local s = sensors[selectedSensorIdx]
    local q = quatFromDir(s.dir, s.up)
    rotation = QuatF(q.x, q.y, q.z, q.w)
          core_camera.setPosition(0, from)
          local rot = quatFromDir(sensor.pos - from, vec3(0, 0, 1))
          core_camera.setRotation(0, rot)
@/lua/ge/extensions/scenario/raceMarkers/singleHologramMarker.lua

  local rot = quatFromDir(self.normal:z0())
  local up = vec3(0,0,1)
@/lua/ge/extensions/util/procTrack.lua
    --pos = pos
    rot = quatFromDir(vec3(-rot.x,-rot.y))
    scenario.startingTransforms['scenario_player0'].pos = pos
@/lua/ge/extensions/editor/toolUtilities/meshAuditionMgr.lua
  gView:set(0.0, -meshRad * auditionPlanarDistFac, auditionHeight + meshRad * auditionElevationFac)
  local gRot = quatFromDir(auditionVec - gView)
  commands.setFreeCamera()
  tmp1:set(auditionVec.x - auditionCamPos.x, auditionVec.y - auditionCamPos.y, auditionVec.z - auditionCamPos.z)
  local gRot = quatFromDir(tmp1)
  core_camera.setPosRot(0, auditionCamPos.x, auditionCamPos.y, auditionCamPos.z, gRot.x, gRot.y, gRot.z, gRot.w)
@/lua/ge/extensions/flowgraph/nodes/scene/getPointOnDecalroad.lua

    local q = quatFromDir(forward, vec3(0,0,1))
    self.pinOut.rot.value = {q.x,q.y,q.z,q.w}
@/lua/ge/extensions/freeroam/bigMapMode.lua
  end
  local rot1 = quatFromDir(vec3(-1,0,0), vec3(0,0.6,1))
  local rot2 = quatFromDir(vec3(0,1,0), vec3(0.6,0,1))
  local rot1 = quatFromDir(vec3(-1,0,0), vec3(0,0.6,1))
  local rot2 = quatFromDir(vec3(0,1,0), vec3(0.6,0,1))
  local rot3 = quatFromDir(vec3(1,0,0), vec3(0,-0.6,1))
  local rot2 = quatFromDir(vec3(0,1,0), vec3(0.6,0,1))
  local rot3 = quatFromDir(vec3(1,0,0), vec3(0,-0.6,1))
  local rot4 = quatFromDir(vec3(0,-1,0), vec3(-0.6,0,1))
  local rot3 = quatFromDir(vec3(1,0,0), vec3(0,-0.6,1))
  local rot4 = quatFromDir(vec3(0,-1,0), vec3(-0.6,0,1))
  mapBoundsFogPool[1]:setPosRot(edgePoint1.x, edgePoint1.y, edgePoint1.z, rot1.x, rot1.y, rot1.z, rot1.w)
  local camMode = core_camera.getGlobalCameras().bigMap
  bigMapCamRotation = quatFromDir(vec3(0,0,-1), yVector)
  bigMapCamRotation = quatFromAxisAngle(xVector, -(90 - camMode.angle) / 180 * math.pi):__mul(bigMapCamRotation)
    local camDir = core_camera.getQuat() * yVector
    local downwardsRot = quatFromDir(vec3(0,0,-1), camDir)
    local m1 = { fov = core_camera.getFovDeg(), movingEnd = true, movingStart = false, positionSmooth = 0.5, pos = startPos, rot = core_camera.getQuat(), time = 0, trackPosition = false, nearClip = previousNearClip  }
    local playerCamDir = endMarkerData.rot * yVector
    local downwardsRot = quatFromDir(vec3(0,0,-1), playerCamDir)
    local m1 = { fov = core_camera.getFovDeg(), movingEnd = true, movingStart = false, positionSmooth = 0.5, pos = startPos, rot = core_camera.getQuat(), time = 0, trackPosition = false, nearClip = camMode.nearClipValue  }
@/gameplay/missionTypes/cannon/customNodes/cannonBallInfoNode.lua
        local targetCamPos = pos - (pos - core_camera.getPosition()):normalized() * 15 --pos + (targetCamOff:normalized()) * camDist
        local targetCamRot = quatFromDir(pos - targetCamPos, vec3(0,0,1))
        self.pinOut.camOffsetPos.value = (pos - targetCamPos):toTable()
@/lua/ge/extensions/core/cameraModes/handheld.lua
  end
  data.res.rot = quatFromDir(self.dir, up)
  return true
@/lua/ge/extensions/editor/vehicleEditor/liveEditor/vePropTransformer.lua
  -- Vehicle coordinates -> Prop coordinates
  local rot = quatFromDir(-dirFront, dirUp)

  local axisGizmoPos = quatFromDir(-dirFront, dirUp) * (baseTranslationJBeamCoords - refPos)
  axisGizmoPos:setAdd(vEditor.vehiclePos)
  local refPos = vEditor.vdata.nodes[vEditor.vdata.refNodes[0].ref].pos
  local rot = quatFromDir(-dirFront, dirUp)
  local refPos = vEditor.vdata.nodes[vEditor.vdata.refNodes[0].ref].pos
  local rot = quatFromDir(-dirFront, dirUp)
@/lua/ge/extensions/gameplay/traffic.lua
    local normal = map.surfaceNormal(pos, 1)
    local rot = quatFromDir(vecY:rotated(quatFromDir(dir, normal)), normal)
    local normal = map.surfaceNormal(pos, 1)
    local rot = quatFromDir(vecY:rotated(quatFromDir(dir, normal)), normal)
    local newPos, newRot = gameplay_traffic_trafficUtils.finalizeSpawnPoint(spawnData.pos, spawnData.dir, spawnData.n1, spawnData.n2, {legalDirection = true})
    newRot = quatFromDir(newRot, map.surfaceNormal(newPos))
    respawnVehicle(id, newPos, newRot)
@/lua/ge/extensions/gameplay/rally/cutCapture.lua
  local vehPos = self.vehicle:getPosition()
  local vehRot = quatFromDir(self.vehicle:getDirectionVector(), self.vehicle:getDirectionVectorUp())
  local now = rallyUtil.getTime()
@/lua/ge/extensions/flowgraph/nodes/vehicle/flipUpright.lua
  if veh then
    spawn.safeTeleport(veh, veh:getPosition(), quatFromDir(veh:getDirectionVector()), nil, nil, nil, nil, false )
    extensions.hook('onVehicleFlippedUpright', veh:getID())
@/lua/ge/extensions/gameplay/missions/missionManager.lua
    startingInfo.vehPos = veh:getPosition()
    startingInfo.vehRot = quatFromDir(vec3(veh:getDirectionVector()), vec3(veh:getDirectionVectorUp()))
    startingInfo.vehId = veh:getID()
@/lua/ge/extensions/core/cameraModes/onboard.lua
    data.res.pos = carPos + nodePos
    data.res.rot = quatFromDir(vecY, vecZ)
    return false

  local qdir = quatFromDir(dir)
  rotatedUp:setRotate(qdir, vecZ)
@/lua/ge/extensions/editor/roadDecorations.lua

    local rotation = quatFromDir(flatDir)
  rotation = rightPoint['rotation']
  rotation = rightPoint['rotation'] * quatFromDir(vec3(0, -1, 0))
@/lua/ge/extensions/gameplay/race/startPosition.lua
    normalTip = vec3(normalTip.x, normalTip.y, core_terrain.getTerrainHeight(normalTip))
    self.rot = quatFromDir((center - normalTip):normalized(), (flU-bl):normalized())
  else
  else
    self.rot = quatFromDir((fl - bl):normalized(), (flU-bl):normalized())
  end
@/lua/ge/extensions/core/vehicleMirrors.lua
    local lookDir = (norm + m.userCorrection):normalized()
    --local mirrorCamQuatF = quatFromDir(norm, id32:normalized())
    -- local c = camMirrorDir:cross(lookDir)
    local refrectCamQuatF = quatFromDir(reflectionDir, id32:normalized())
@/lua/ge/extensions/editor/gen/exp_meshexplorer.lua
--        core_camera.setPosition(0,vec3(0,10,2))
--        core_camera.setRotation(0,quatFromDir(vec3(-1.5,-1,0)))
        camTarget = {dir=vec3(-1.5,-10,0)}
            local dir = vec3(1,0,0)*t + vec3(1,1,0)
            lo('?? for_dir:'..tostring(quatFromDir()))
        end
--            core_camera.setRotation(0, quatFromEuler(math.pi/4,0,0)) --(0, 0, math.pi/2),)
--            core_camera.setRotation(0, quatFromDir(vec3(1,1,0))) --(0, 0, math.pi/2),)
--            local q = quatFromDir(vec3(1,1,0))+quatFromDir(vec3(1,1,0))
--            core_camera.setRotation(0, quatFromDir(vec3(1,1,0))) --(0, 0, math.pi/2),)
--            local q = quatFromDir(vec3(1,1,0))+quatFromDir(vec3(1,1,0))
--            core_camera.setPosRot(0, 0, 5, 3, 0, 0, 0.02, 1)
--            core_camera.setRotation(0, quatFromDir(vec3(1,1,0))) --(0, 0, math.pi/2),)
--            local q = quatFromDir(vec3(1,1,0))+quatFromDir(vec3(1,1,0))
--            core_camera.setPosRot(0, 0, 5, 3, 0, 0, 0.02, 1)
            camTarget.cpos = core_camera.getPosition()
            camTarget.crot = quatFromDir(core_camera.getForward()) --core_camera.getQuat()
--                lo('??++++++++++++ to_DIR:'..tostring(camTarget.dir)..':'..tostring(camTarget.crot)..':'..tostring(quatFromDir(core_camera.getForward())))
            camTarget.crot = quatFromDir(core_camera.getForward()) --core_camera.getQuat()
--                lo('??++++++++++++ to_DIR:'..tostring(camTarget.dir)..':'..tostring(camTarget.crot)..':'..tostring(quatFromDir(core_camera.getForward())))
--            local eu = core_camera.getQuat():toEulerYXZ()
        end
        local q = camTarget.crot*(1-t)+quatFromDir(camTarget.dir)*t
--            lo('?? for_q:'..tostring(camTarget.crot)..'>'..tostring(q))
@/lua/ge/extensions/gameplay/crawl/utils.lua
    local vehiclePos = veh:getPosition()
    local vRot = quatFromDir(veh:getDirectionVector(), veh:getDirectionVectorUp())
    local x,y,z = vRot * vec3(1,0,0),vRot * vec3(0,1,0),vRot * vec3(0,0,1)
  local vehDirUp = state.crawlerData.dynamicData.vehDirectionVectorUp
  local vehRot = quatFromDir(vehDir, vehDirUp)
@/lua/ge/extensions/gameplay/markers/missionMarker.lua
      local toCamera = (data.camPos - tmpVec):z0():normalized()
      local rot = quatFromDir(toCamera):toTorqueQuat()
      meshObj:setField('rotation', 0, rot.x .. ' ' .. rot.y .. ' ' .. rot.z .. ' ' .. rot.w)
@/lua/ge/extensions/flowgraph/nodes/scene/rectMarker.lua
      pos = vec3(hit.pt) + zVec*0.05
      r =   r* qOff*quatFromDir(vec3(hit.norm), yVec)
    else
      pos = corner + zVec*0.05
      r = r*qOff *quatFromDir(zVec, yVec)
    end
@/lua/ge/extensions/gameplay/rally/vehicleCapture.lua
  local vehPos = self.vehicle:getPosition()
  local vehRot = quatFromDir(self.vehicle:getDirectionVector(), self.vehicle:getDirectionVectorUp())
  local now = rallyUtil.getTime()
@/lua/ge/extensions/editor/levelValidator.lua
      local pos = center + rot * vec3(0, -15, 0)
      local rot = quatFromDir(center - pos)
      if pos.x ~= 0 or pos.y ~=0 or pos.z ~= 0 then
@/lua/ge/extensions/core/cameraModes/topDown.lua
  -- then look from camera position to target :)
  local qdir = quatFromDir((targetPos - camPos):normalized())
@/lua/ge/extensions/editor/vehicleEditor/staticEditor/veStaticRenderView.lua
      pos = mainRVData.pos or vec3(0,0,0),
      rot = mainRVData.rot and quat(mainRVData.rot) or quatFromDir(vec3(0,1,0), unitVecs[3]),
      gridRot = mainRVData.gridRot and quat(mainRVData.gridRot) or quatFromAxisAngle(vec3(1,0,0), math.rad(90)),
    mainRVData.pos = vec3(0,0,0)
    mainRVData.gridRot = quatFromDir(unitVecs[3], unitVecs[2])
    if viewMode == VIEW_MODE_LEFT then
      qDir = quatFromDir(vec3(1,0,0), unitVecs[3])
    elseif viewMode == VIEW_MODE_RIGHT then
    elseif viewMode == VIEW_MODE_RIGHT then
      qDir = quatFromDir(vec3(-1,0,0), unitVecs[3])
    elseif viewMode == VIEW_MODE_BACK then
    elseif viewMode == VIEW_MODE_BACK then
      qDir = quatFromDir(vec3(0,1,0), unitVecs[3])
    elseif viewMode == VIEW_MODE_FRONT then
    elseif viewMode == VIEW_MODE_FRONT then
      qDir = quatFromDir(vec3(0,-1,0), unitVecs[3])
    elseif viewMode == VIEW_MODE_BOTTOM then
    elseif viewMode == VIEW_MODE_BOTTOM then
      qDir = quatFromDir(vec3(0,0,1), unitVecs[3])
    elseif viewMode == VIEW_MODE_TOP then
    elseif viewMode == VIEW_MODE_TOP then
      qDir = quatFromDir(vec3(0,0,-1), unitVecs[1])
    else
@/lua/ge/extensions/editor/tech/roadArchitect/staticMeshMgr.lua
  gView:set(0.0, -meshRad * auditionPlanarDistFac, auditionHeight + meshRad * auditionElevationFac)
  local gRot = quatFromDir(auditionVec - gView)
  commands.setFreeCamera()
  auditionCamPos:set(x * c - y * s, x * s + y * c, gView.z)
  local gRot = quatFromDir(auditionVec - auditionCamPos)
  core_camera.setPosRot(0, auditionCamPos.x, auditionCamPos.y, auditionCamPos.z, gRot.x, gRot.y, gRot.z, gRot.w)
@/lua/ge/extensions/scenario/raceMarkers/attention.lua
    local fwd = (playerPosition-self.pos)
    local rot = (quatFromDir(fwd:z0())):toTorqueQuat()
    self.left:setField('rotation', 0, rot.x .. ' ' .. rot.y .. ' ' .. rot.z .. ' ' .. rot.w)
@/gameplay/missionTypes/collection/customNodes/collectionNode.lua
      pos = marker.pos,
      rot = quatFromDir(-1*veh:getDirectionVector())
    }
@/lua/ge/extensions/gameplay/race/race.lua
    local vehiclePos = vehicle:getPosition()
    local vRot = quatFromDir(vehicle:getDirectionVector(), vehicle:getDirectionVectorUp())
    local x,y,z = vRot * vec3(1,0,0),vRot * vec3(0,1,0),vRot * vec3(0,0,1)
        local vehiclePos = veh:getPosition()
        local vRot = quatFromDir(veh:getDirectionVector(), veh:getDirectionVectorUp())
        local x,y,z = vRot * vec3(1,0,0),vRot * vec3(0,1,0),vRot * vec3(0,0,1)
@/lua/ge/extensions/core/cameraModes/observer.lua
  local dir = (data.pos - camPos):normalized()
  local qdir = quatFromDir(dir)
@/lua/vehicle/bdebugImpl.lua
    local initRefNodePos = v.data.nodes[v.data.refNodes[0].ref].pos
    local rot = quatFromDir(-obj:getDirectionVector(), obj:getDirectionVectorUp())
    local relCOGPos = rot:inversed() * (p - vehPos) + initRefNodePos
@/lua/ge/extensions/editor/trafficSignalsEditor.lua
  if instances[selected.signal] then
    instances[selected.signal].rot = quatFromDir(instances[selected.signal].dir, vecUp)
    oldTransform.pos = vec3(instances[selected.signal].pos)
@/lua/ge/extensions/flowgraph/modules/prefabModule.lua
      -- get current position and rotation
      vehicleTransforms[k] = {pos = veh:getPosition(), rot = quat(0, 0, 1, 0) * quatFromDir(veh:getDirectionVector(), veh:getDirectionVectorUp())}
    end
@/lua/ge/extensions/gameplay/race/pathnode.lua
  if alignMode == 'terrain' then
    rot = qOff * pRot * quatFromDir(vec3(hit.norm), self.normal)
  elseif alignMode == 'pathnode' then
  elseif alignMode == 'pathnode' then
    rot = qOff * pRot * quatFromDir(vec3(0,0,1), self.normal)
  elseif alignMode == 'absolute' then
  alignMode = alignMode or "terrain"
  local rot = quatFromDir(self.normal:z0())
  local up = vec3(0,0,1)
@/lua/ge/extensions/editor/scriptAIEditor.lua
  local height = groundDist / tan(halfFov) + zMax + 5.0                           -- The height that the camera should be to fit all the trajectory in view.
  local rot = quatFromDir(vec3(0, 0, -1))
  commands.setFreeCamera()
        table.clear(cwd.nodes)
        local rot = quatFromDir(vec3(0, 0, -1))
        rot:normalize()
@/gameplay/missionTypes/scatterPickup/customNodes/scatterPrefabSetupNode.lua
          local fwd = vec3(0,1,0):projectToOriginPlane(point.normal)
          local rot = quatFromEuler(0,0,math.random() * 360) * quatFromDir(fwd, point.normal)
          local trot = rot:toTorqueQuat()
@/lua/ge/extensions/gameplay/police.lua

                  placeRoadblock(newVehIds, spawnData.pos, quatFromDir(spawnData.dir, spawnData.normal), {angle = angle, centerAngle = 0, width = rbWidth})
                  if newPropIds then
                  if newPropIds then
                    placeRoadblock(policePropIds, spawnData.pos - spawnData.dir * (maxPropLength * 0.5 + 2), quatFromDir(spawnData.dir, spawnData.normal), {angle = -90, width = rbWidth})
                  end
@/lua/ge/extensions/editor/aiTests.lua
          v.pos:set(obj:getPosition())
          v.rot:set(quatFromDir(obj:getDirectionVector(), obj:getDirectionVectorUp()) * quat(0, 0, 1, 0))
@/lua/ge/extensions/editor/gen/world.lua
--					lo('?? for_DIR:'..tostring(wall.u)..':'..tostring(wall.v)..':'..tostring(dir))
			local q = quatFromDir(dir, vec3(0,0,1))
			local rot = QuatF(q.x,q.y,q.z,q.w)
			local rot = QuatF(q.x,q.y,q.z,q.w)
--				rot = quatFromDir(vec3(-1,0,0), vec3(0,0,1))
			local mat = rot:getMatrix()
		end
		core_camera.setRotation(0, quatFromDir(newdir, vec3(0,0,1)))
--        lo('?? around:'..tostring(indrag))
	-- turn camera in direction of dirnew
	core_camera.setRotation(0, quatFromDir(dirnew, vec3(0,0,1)))
	core_camera.setPosition(0, newpos)
	core_camera.setRotation(0, quatFromDir(newdir, vec3(0,0,1)))
]]
	--    core_camera.setRotation(0, vec3(0,0,math.pi/4))
	--    core_camera.setRotation(0, quatFromDir(vec3(0, -10, -1),vec3(0,0,1)))
		core_camera.setRotation(0, quatFromDir(vec3(0, -10, 4), vec3(0,0,1)))
	--    core_camera.setRotation(0, quatFromDir(vec3(0, -10, -1),vec3(0,0,1)))
		core_camera.setRotation(0, quatFromDir(vec3(0, -10, 4), vec3(0,0,1)))
	end
@/lua/ge/extensions/editor/toolUtilities/gizmo.lua
    tmpTan:normalize()
    beginDragRot = quatFromDir(tmpTan, spline.nmls[nodeIdx])
  end
        tmpTan:normalize()
        local q = quatFromDir(tmpTan, spline.nmls[nodeIdx])
        rotation.x, rotation.y, rotation.z, rotation.w = q.x, q.y, q.z, q.w
@/lua/ge/extensions/gameplay/drag/utils.lua
  racer.vehDirectionVectorUp:set(racer.vehObj:getDirectionVectorUpXYZ())
  racer.vehRot = quatFromDir(racer.vehDirectionVector, racer.vehDirectionVectorUp)
@/lua/ge/extensions/core/cameraModes/pacenoteOrbit.lua
  data.res.pos = camPos
  data.res.rot = quatFromDir(targetPos - camPos)
  data.res.fov = self.fov
@/lua/ge/extensions/gameplay/drag/general.lua
    local up = vehicle:getDirectionVectorUp()
    local vehicleRot = quatFromDir(forward, up)
    local x, y, z = vehicleRot * vec3(1,0,0), vehicleRot * vec3(0,1,0), vehicleRot * vec3(0,0,1)
    local up = vehicle:getDirectionVectorUp()
    local vehicleRot = quatFromDir(forward, up)
    local x, y, z = vehicleRot * vec3(1,0,0), vehicleRot * vec3(0,1,0), vehicleRot * vec3(0,0,1)
@/lua/ge/extensions/tech/techCore.lua
  local direction = request['dir']
  local rot = quatFromDir(vec3(direction[1], direction[2], direction[3]))
      local vehicleData = map.objects[obj.id]
      rot = quatFromDir(vehicleData.dirVec, vehicleData.dirVecUp)
    end
      local vDir, vUp = vec3(dir[1], dir[2], dir[3]), vec3(up[1], up[2], -up[3])
      local rot = quatFromDir(vDir, vUp):toEulerYXZ() * 57.29578 -- rad to deg.
      core_camera.setRotation(vid, rot)
@/lua/ge/extensions/core/cameraModes/predictor.lua
  data.res.targetPos:setAdd(self.dtFuture * data.vel)
  data.res.rot = quatFromDir((data.res.targetPos - data.res.pos):normalized())
  return true
@/lua/ge/extensions/editor/sitesEditor/zones.lua
    if editor.getAxisGizmoAlignment() == editor.AxisGizmoAlignment_Local then
      local q = quatFromDir(quatFromEuler(0, math.pi / 2, 0) * self.currentPlane.normal, vec3(0, 0, 1))
      rotation = QuatF(q.x, q.y, q.z, q.w)
  if self.currentPlane then
    self.beginDragRotation = deepcopy(quatFromDir(quatFromEuler(0, math.pi / 2, 0) * self.currentPlane.normal, vec3(0, 0, 1)))
  end
@/lua/ge/extensions/gameplay/rally/vehicleTracker.lua
      local vehiclePos = vehicle:getPosition()
      local vRot = quatFromDir(vehicle:getDirectionVector(), vehicle:getDirectionVectorUp())
      local x,y,z = vRot * vec3(1,0,0),vRot * vec3(0,1,0),vRot * vec3(0,0,1)
--       local vPos = vehicle:getPosition()
--       local vRot = quatFromDir(vehicle:getDirectionVector(), vehicle:getDirectionVectorUp())
--       for i, corner in ipairs(self.wheelOffsets) do
@/lua/ge/extensions/flowgraph/nodes/mission/postClean.lua

      spawn.safeTeleport(veh, veh:getPosition(), quatFromDir(veh:getDirectionVector(), veh:getDirectionVectorUp()), nil, nil, nil, nil, doRepair)
    end
@/lua/ge/extensions/core/cameraModes/path.lua
  end
  local targetRotation = quatFromDir(target - pos, vec3(0,0,1))
@/lua/ge/extensions/core/cameraModes/chase.lua
    data.res.pos = data.pos
    data.res.rot = quatFromDir(vecY, vecZ)
    return false

  local qdir_heading = quatFromDir(-dir, up)
  calculatedCamPos = qdir_heading * calculatedCamPos
  local dir_target = (targetPos - camPos); dir_target:normalize()
  local qdir_target = quatFromDir(dir_target, up)
@/lua/ge/extensions/gameplay/rally/notebook/pacenote.lua
    local up = vec3(0,0,1)
    local rot = quatFromDir(fwd, up):normalized()
@/lua/ge/extensions/editor/renderTest.lua

    --rot = quatFromDir(vec3(0,0,-1), vecUp)
    if focusPos then
@/lua/ge/extensions/career/modules/playerDriving.lua
    local playerVehObj = getPlayerVehicle(0)
    spawn.safeTeleport(getObjectByID(vehId), playerVehObj:getPosition(), quatFromDir(playerVehObj:getDirectionVector()), nil, nil, nil, nil, false)
    core_vehicleBridge.executeAction(getObjectByID(vehId),'setIgnitionLevel', 0)
      local vehId = inventory.getVehicleIdFromInventoryId(favoriteVehicleInventoryId)
      spawn.safeTeleport(getObjectByID(vehId), playerVehObj:getPosition(), quatFromDir(playerVehObj:getDirectionVector()), nil, nil, nil, nil, false)
    end)

  local m1 = { fov = 30, movingEnd = false, movingStart = false, positionSmooth = 0.5, pos = startPos, rot = quatFromDir(targetPos - startPos), time = 0, trackPosition = false  }
  local m2 = { fov = 30, movingEnd = false, movingStart = false, positionSmooth = 0.5, pos = startPos, rot = quatFromDir(targetPos - startPos), time = 0.5, trackPosition = false  }
  local m1 = { fov = 30, movingEnd = false, movingStart = false, positionSmooth = 0.5, pos = startPos, rot = quatFromDir(targetPos - startPos), time = 0, trackPosition = false  }
  local m2 = { fov = 30, movingEnd = false, movingStart = false, positionSmooth = 0.5, pos = startPos, rot = quatFromDir(targetPos - startPos), time = 0.5, trackPosition = false  }
  local m3 = { fov = core_camera.getFovDeg(), movingEnd = false, movingStart = false, positionSmooth = 0.5, pos = core_camera.getPosition(), rot = endDir and quatFromDir(endDir) or core_camera.getQuat(), time = 5.5, trackPosition = false }
  local m2 = { fov = 30, movingEnd = false, movingStart = false, positionSmooth = 0.5, pos = startPos, rot = quatFromDir(targetPos - startPos), time = 0.5, trackPosition = false  }
  local m3 = { fov = core_camera.getFovDeg(), movingEnd = false, movingStart = false, positionSmooth = 0.5, pos = core_camera.getPosition(), rot = endDir and quatFromDir(endDir) or core_camera.getQuat(), time = 5.5, trackPosition = false }
  path.markers = {m1, m2, m3}
@/lua/ge/extensions/editor/cosimulationSignalEditor.lua
        local veh = vehicle.veh
        local pos, rot = veh:getPosition(), quatFromDir(veh:getDirectionVector(), veh:getDirectionVectorUp())
        csv:add('vehicle', nil, 'posX', tostring(pos.x), "number", nil, nil, nil)
@/lua/ge/extensions/career/modules/testDrive.lua
      local finalPos = oobb:getPoint(0) + (dir * 1.3)
      gameplay_walk.setWalkingMode(true, finalPos, quatFromDir(-dir, vec3(0,0,1)))
    else
@/lua/ge/extensions/tech/impactgen/crashOutput.lua
    local camDir = vec3(-camPos.x, -camPos.y, -camPos.z)
    local camRot = quatFromDir(camDir, vec3(0, 0, 1))
    camPos = camPos + origin
@/lua/ge/extensions/flowgraph/nodes/scene/camera/cameraAutoRotate.lua
  local camPos = core_camera.getPosition()
  local camRot = quatFromDir(vec3(self.pinIn.position.value) - camPos, vecUp)
  core_camera.setPosRot(0, camPos.x, camPos.y, camPos.z, camRot.x, camRot.y, camRot.z, camRot.w)
@/lua/vehicle/recovery.lua
    if useSmartSpawn then
      local rot = quatFromDir(dirFront, dirUp)
      obj:queueGameEngineLua("spawn.safeTeleport(getObjectByID("..obj:getId().."), vec3("..recPoint.pos.x..","..recPoint.pos.y..","..recPoint.pos.z.."), quat("..rot.x..","..rot.y..","..rot.z..","..rot.w.."), nil, nil, " .. tostring(moveTraffic) ..  ")")
      if pitchLimit ~= nil and (math.abs(pitch) > pitchLimit or math.abs(roll) > rollLimit) then
        rot = quatFromDir(-dirFront, upVector)
      else
      else
        rot = quatFromDir(-dirFront, dirUp)
      end
@/lua/ge/extensions/gameplay/taxi.lua
          local direction = (path[i+1].pos - marker.pos):normalized()
          skipRotation = quatFromDir(direction, vec3(0, 0, 1))
        end
@/lua/ge/extensions/core/cameraModes/orbit.lua
    data.res.pos = data.pos
    data.res.rot = quatFromDir(vecY, vecZ)
    return false
@/lua/ge/extensions/editor/raceEditor/startPositions.lua

    local q = quatFromDir(normal, vec3(0,0,1))
    local x, y, z = q * vec3(1,0,0), q * vec3(0,3,0), q * vec3(0,0,1)
        sp:set(data.mouseInfo._downPos,
        quatFromDir(data.mouseInfo._upPos - data.mouseInfo._downPos):normalized(), vec3(0,0,1))
        data.spid = sp.id
        normalTip = vec3(normalTip.x, normalTip.y, core_terrain.getTerrainHeight(normalTip))
        sp.rot = quatFromDir((sp.pos - normalTip):normalized(), vec3(0,0,1))
        self:updateTransform(self.index)
@/lua/ge/extensions/editor/gen/exp_solidflex.lua
            core_camera.setPosition(0, ccampos)
            core_camera.setRotation(0, quatFromDir(focus - ccampos, vec3(0,0,1)))
        end
                core_camera.setPosition(0, focus + rnew)
                core_camera.setRotation(0, quatFromDir(focus - core_camera.getPosition(), vec3(0,0,1)))
            local ami1,ami2,vmi1,vmi2
@/lua/ge/extensions/gameplay/discover.lua
-- use this to get the position, rotation and partConfig of all vehicles
for id in activeVehiclesIterator() do local veh = scenetree.findObjectById(id) print(veh) dump({veh:getPosition(), quatFromDir(veh:getDirectionVector(), veh:getDirectionVectorUp()), veh.jbeam, veh.partConfig}) end
]]
@/lua/ge/extensions/c2/panelPlugins/vehicleManager.lua
  local up = vec3(veh:getDirectionVectorUpXYZ())
  local rot = quatFromDir(dir, up)
  local vel = veh:getVelocity()
@/lua/ge/extensions/core/vehicle/mirror.lua
        local camPos = veh:getInitialNodePosition(core_camera.getDriverDataById(vid))
        local rot = quatFromDir( (camPos-mpos) , vec3(0,0,1) )
        local eu = rot:toEulerYXZ()
@/lua/ge/extensions/core/quickAccess.lua
          onSelect = function()
            spawn.safeTeleport(playerVeh, playerVeh:getPosition(), quatFromDir(playerVeh:getDirectionVector()), nil, nil, nil, nil, false )
            extensions.hook('onVehicleFlippedUpright', playerVeh:getID())
            getPlayerVehicle(0):resetBrokenFlexMesh()
            spawn.safeTeleport(getPlayerVehicle(0), getPlayerVehicle(0):getPosition(), quatFromDir(getPlayerVehicle(0):getDirectionVector(), getPlayerVehicle(0):getDirectionVectorUp()), nil, nil, nil, nil, true)
            return {"hide"}
      veh:resetBrokenFlexMesh()
      spawn.safeTeleport(veh, veh:getPosition(),quatFromDir(veh:getDirectionVector(), veh:getDirectionVectorUp()))
    end
@/lua/ge/extensions/editor/createObjectTool.lua
    local pos = obj:getPosition()
    local rot = quatFromDir(rayCastInfo.normal)
    local mtx = MatrixF(0)
@/lua/ge/extensions/core/groundMarkerArrows.lua
              local pos = path[i].pos + arrowHeight
              local rot = quatFromDir(dirNextPoint, upVec)
              -- Update proxy
@/lua/ge/extensions/gameplay/sites/parkingSpot.lua
    normalTip = vec3(normalTip.x, normalTip.y, core_terrain.getTerrainHeight(normalTip))
    self.rot = quatFromDir((center - normalTip):normalized(), (flU-bl):normalized())
  else
  else
    self.rot = quatFromDir((fl - bl):normalized(), (flU-bl):normalized())
  end
@/lua/ge/extensions/freeroam/crashCamMode.lua
  local m1 = { fov = core_camera.getFovDeg(), movingEnd = false, movingStart = false, positionSmooth = 0.5, pos = startPos, rot = core_camera.getQuat(), time = 0, trackPosition = false, nearClip = nil  }
  local m2 = { fov = 50, movingEnd = false, movingStart = false, positionSmooth = 0.5, pos = adjustedHitPoint + offset1, rot = quatFromDir(-offset1), time = markerTimeOffset, trackPosition = false, nearClip = nil }
  local m3 = { fov = 50, movingEnd = false, movingStart = false, positionSmooth = 0.5, pos = adjustedHitPoint + offset2, rot = quatFromDir(-offset2), time = markerTimeOffset * 2, trackPosition = false, nearClip = nil }
  local m2 = { fov = 50, movingEnd = false, movingStart = false, positionSmooth = 0.5, pos = adjustedHitPoint + offset1, rot = quatFromDir(-offset1), time = markerTimeOffset, trackPosition = false, nearClip = nil }
  local m3 = { fov = 50, movingEnd = false, movingStart = false, positionSmooth = 0.5, pos = adjustedHitPoint + offset2, rot = quatFromDir(-offset2), time = markerTimeOffset * 2, trackPosition = false, nearClip = nil }
  local m4 = { fov = 50, movingEnd = false, movingStart = false, positionSmooth = 0.5, pos = adjustedHitPoint + offset3, rot = quatFromDir(-offset3), time = markerTimeOffset * 3, trackPosition = false, nearClip = nil }
  local m3 = { fov = 50, movingEnd = false, movingStart = false, positionSmooth = 0.5, pos = adjustedHitPoint + offset2, rot = quatFromDir(-offset2), time = markerTimeOffset * 2, trackPosition = false, nearClip = nil }
  local m4 = { fov = 50, movingEnd = false, movingStart = false, positionSmooth = 0.5, pos = adjustedHitPoint + offset3, rot = quatFromDir(-offset3), time = markerTimeOffset * 3, trackPosition = false, nearClip = nil }
  local m5 = { fov = core_camera.getFovDeg(), movingEnd = false, movingStart = false, positionSmooth = 0.5, pos = startPos, rot = core_camera.getQuat(), time = markerTimeOffset * 4, trackPosition = false, nearClip = nil }
@/lua/ge/extensions/gameplay/crawl/boundary.lua
        local dirVec = (endPos - startPos):normalized()
        local rot = quatFromDir(dirVec, worldUp)
        table.insert(points, {pos = pos, rot = rot})
@/lua/ge/extensions/editor/vehicleEditor/liveEditor/veView.lua
  if view.mode == 'left' then
    view.rot = quatFromDir(vec3(-1,0,0), vecUp)
    if view.mouseDragging0 and view.lastMouseDragPos then
      view.pos = focusPos + focusRot * vec3(10, 0, 0)
      view.rot = quatFromDir(focusPos - view.pos, vecUp)
      _drawgrid(gridSize, view.rot, focusPos - focusRot * view.dragOffset, gridLineWidth)
  elseif view.mode == 'right' then
    view.rot = quatFromDir(vec3(1,0,0), vecUp)
    if view.mouseDragging0 and view.lastMouseDragPos then
      view.pos = focusPos + focusRot * vec3(-3, 0, 0)
      view.rot = quatFromDir(focusPos - view.pos, vecUp)
      _drawgrid(gridSize, view.rot, focusPos - focusRot * view.dragOffset, gridLineWidth)
  elseif view.mode == 'front' then
    view.rot = quatFromDir(vec3(0,1,0), vecUp)
    if view.mouseDragging0 and view.lastMouseDragPos then
      view.pos = focusPos + focusRot * vec3(0, -3, 0)
      view.rot = quatFromDir(focusPos - view.pos, vecUp)
      _drawgrid(gridSize, view.rot, focusPos - focusRot * view.dragOffset, gridLineWidth)
  elseif view.mode == 'back' then
    view.rot = quatFromDir(vec3(0,-1,0), vecUp)
    if view.mouseDragging0 and view.lastMouseDragPos then
      view.pos = focusPos + focusRot * vec3(0, 6, 0)
      view.rot = quatFromDir(focusPos - view.pos, vecUp)
      _drawgrid(gridSize, view.rot, focusPos - focusRot * view.dragOffset, gridLineWidth)
  elseif view.mode == 'top' then
    view.rot = quatFromDir(vec3(0,0,-1), vec3(1,0,0))
    if view.mouseDragging0 and view.lastMouseDragPos then
      view.pos = focusPos + focusRot * vec3(0, 0, 5)
      view.rot = quatFromDir(vec3(0,0,-1), fwd)
      --view.rot = quatFromDir(focusPos - view.pos, vecUp)
      view.rot = quatFromDir(vec3(0,0,-1), fwd)
      --view.rot = quatFromDir(focusPos - view.pos, vecUp)
      _drawgrid(gridSize, view.rot, focusPos - focusRot * view.dragOffset, gridLineWidth)
  elseif view.mode == 'bottom' then
    view.rot = quatFromDir(vec3(0,0,1), vecUp)
    if view.mouseDragging0 and view.lastMouseDragPos then
      view.pos = focusPos + focusRot * vec3(0.01, 0.01, -5)
      view.rot = quatFromDir(focusPos - view.pos, vecUp)
      _drawgrid(gridSize, view.rot, focusPos - focusRot * view.dragOffset, gridLineWidth)
@/lua/ge/extensions/editor/objectToSplineEditor.lua

      table.insert(points, {pos = pos, rot = quatFromDir(dirVec, dirVecUp) * rotOffset * quatFromEuler(math.pi, math.pi, math.pi)})
      count = count + 1
@/lua/ge/extensions/tech/multiscreen.lua
  if veh then
    local vehicleRotation = quatFromDir(veh:getDirectionVector(), veh:getDirectionVectorUp())
    local vehiclePosition = veh:getPosition()
@/lua/ge/extensions/core/ropeVisualTest.lua
            local lookDir = (vec3(centerX, centerY, centerZ) - cameraPos):normalized()
            local camLookFrontRot = quatFromDir(lookDir)
@/lua/ge/extensions/util/maptiles.lua
    -- Use the same camera orientation as before
    local q = quatFromDir(vec3(0, 0, -1), vec3(0, 1, 0))
    q = QuatF(q.x, q.y, q.z, q.w)
@/lua/ge/extensions/editor/buildingEditor.lua
]]
--            core_camera.setRotation(0, quatFromDir(vec3(0, -1, -1),vec3(0,0,1)))
--            core_camera.setPosition(0, vec3(0, 40, 60))
		local pos = vec3(0, 0, 5) - 2*vec3(0, -10, -1)
		local q = quatFromDir(vec3(0, -10, -1),vec3(0,0,1))
@/lua/ge/server/commands.lua
  camDir.z = 0
  local camRot = quatFromDir(camDir, vec3(0,0,1))
  local rot =  quat(0, 0, 1, 0) * camRot -- vehicles' forward is inverted
  camDir.z = 0
  local camRot = quatFromDir(camDir, vec3(0,0,1))
  camRot = quat(0, 0, 1, 0) * camRot -- vehicles' forward is inverted
@/lua/ge/extensions/editor/camPathEditor.lua
      end
      local targetRotation = quatFromDir(target - pos, zVector)
      local r1 = lastCtrlPointsR2[i] or (markers[n1].trackPosition and targetRotation or markers[n1].rot)
        end
        markerCopy.rot = quatFromDir(target - markerCopy.pos, zVector)
      end
@/lua/ge/extensions/core/cameraModes/autopoint.lua
  data.res.rot = data.res.rot or quat()
  data.res.rot:set(quatFromDir((data.res.targetPos - data.res.pos):normalized()))
  return true
@/lua/ge/extensions/scenario/raceMarkers/sideColumnMarker.lua
  local normal = self.normal and self.normal or (playerPosition-self.pos):normalized()
  local rot = quatFromDir(normal:z0()):toTorqueQuat()
  if distanceFromMarker > self.radius*1.5 then
@/lua/ge/extensions/scenario/raceMarkers/crawlMarker.lua
      self.flagLeft:setPosition(vec3(leftPos))
      local flagRot = quatFromDir(rightDir, terrainUp)
      self.flagLeft:setField('rotation', 0, flagRot.x .. ' ' .. flagRot.y .. ' ' .. flagRot.z .. ' ' .. flagRot.w)
      self.flagRight:setPosition(vec3(rightPos))
      local flagRot = quatFromDir(-rightDir, terrainUp)
      self.flagRight:setField('rotation', 0, flagRot.x .. ' ' .. flagRot.y .. ' ' .. flagRot.z .. ' ' .. flagRot.w)
    local fwd = (playerPosition-self.pos)
    local rot = quatFromDir(fwd:z0()):toTorqueQuat()
    self.arrow:setField('rotation', 0, rot.x .. ' ' .. rot.y .. ' ' .. rot.z .. ' ' .. rot.w)
@/lua/ge/extensions/core/multiSpawn.lua

    newRot = quatFromDir(vecY:rotated(quatFromDir(newRot:z0(), vecUp)), vecUp)

    newRot = quatFromDir(vecY:rotated(quatFromDir(newRot:z0(), vecUp)), vecUp)
@/lua/ge/extensions/util/screenshotCreator.lua

  local camRot = quatFromDir(bbCenter - (axis1 * halfExtentsY / 8) - finalCamPos)
  -- un-rotate the camera rotation (remove vehicle rotation)
  local vehicleRotation = quatFromDir(bb:getAxis(1),  bb:getAxis(2))
  local vehicleRotationInverse = vehicleRotation:inversed()
  -- rotate the camera rotation by the car rotation
  local vehicleRotation = quatFromDir(bb:getAxis(1),  bb:getAxis(2))
  local finalRot = rotOffset * vehicleRotation
@/lua/ge/extensions/editor/crawlEditor/waypoints.lua
    if editor.getAxisGizmoAlignment() == editor.AxisGizmoAlignment_Local then
      local q = quatFromDir(node.normal, vec3(0,0,1))
      rotation = QuatF(q.x, q.y, q.z, q.w)
  if node.hasNormal and node.normal then
    self.beginDragRotation = deepcopy(quatFromDir(node.normal, vec3(0,0,1)))
  end
@/lua/ge/extensions/editor/rallyEditor/pacenotes.lua
  if editor.getAxisGizmoAlignment() == editor.AxisGizmoAlignment_Local then
    local q = quatFromDir(wp.normal, vec3(0,0,1))
    rotation = QuatF(q.x, q.y, q.z, q.w)
  if wp.normal then
    self.beginDragRotation = deepcopy(quatFromDir(wp.normal, vec3(0,0,1)))
  end
@/lua/ge/extensions/editor/sceneView.lua
      if view.mode == 'left' then
        view.rot = quatFromDir(vec3(-1,0,0), vecUp)
        if view.mouseDragging0 and view.lastMouseDragPos then
          view.pos = focusPos + focusRot * vec3(10, 0, 0)
          view.rot = quatFromDir(focusPos - view.pos, vecUp)
          _drawgrid(gridSize, view.rot, focusPos - focusRot * view.dragOffset, gridLineWidth)
      elseif view.mode == 'right' then
        view.rot = quatFromDir(vec3(1,0,0), vecUp)
        if view.mouseDragging0 and view.lastMouseDragPos then
          view.pos = focusPos + focusRot * vec3(-3, 0, 0)
          view.rot = quatFromDir(focusPos - view.pos, vecUp)
          _drawgrid(gridSize, view.rot, focusPos - focusRot * view.dragOffset, gridLineWidth)
      elseif view.mode == 'front' then
        view.rot = quatFromDir(vec3(0,1,0), vecUp)
        if view.mouseDragging0 and view.lastMouseDragPos then
          view.pos = focusPos + focusRot * vec3(0, -3, 0)
          view.rot = quatFromDir(focusPos - view.pos, vecUp)
          _drawgrid(gridSize, view.rot, focusPos - focusRot * view.dragOffset, gridLineWidth)
      elseif view.mode == 'back' then
        view.rot = quatFromDir(vec3(0,-1,0), vecUp)
        if view.mouseDragging0 and view.lastMouseDragPos then
          view.pos = focusPos + focusRot * vec3(0, 6, 0)
          view.rot = quatFromDir(focusPos - view.pos, vecUp)
          _drawgrid(gridSize, view.rot, focusPos - focusRot * view.dragOffset, gridLineWidth)
      elseif view.mode == 'top' then
        view.rot = quatFromDir(vec3(0,0,-1), vec3(1,0,0))
        if view.mouseDragging0 and view.lastMouseDragPos then
          view.pos = focusPos + focusRot * vec3(0, 0, 5)
          view.rot = quatFromDir(vec3(0,0,-1), fwd)
          --view.rot = quatFromDir(focusPos - view.pos, vecUp)
          view.rot = quatFromDir(vec3(0,0,-1), fwd)
          --view.rot = quatFromDir(focusPos - view.pos, vecUp)
          _drawgrid(gridSize, view.rot, focusPos - focusRot * view.dragOffset, gridLineWidth)
      elseif view.mode == 'bottom' then
        view.rot = quatFromDir(vec3(0,0,1), vecUp)
        if view.mouseDragging0 and view.lastMouseDragPos then
          view.pos = focusPos + focusRot * vec3(0.01, 0.01, -5)
          view.rot = quatFromDir(focusPos - view.pos, vecUp)
          _drawgrid(gridSize, view.rot, focusPos - focusRot * view.dragOffset, gridLineWidth)
@/lua/ge/extensions/scenario/raceMarkers/sideHologramMarker.lua
    local dir = (self.nextPos - self.pos):normalized()
    local rot = quatFromDir(dir)
    local rotQuat = rot:toTorqueQuat()
  -- Calculate side positions with ground raycasts
  local rot = quatFromDir(self.normal:z0())
  local up = vec3(0,0,1)
@/lua/vehicle/ai.lua
    local up = mapmgr.surfaceNormalBelow(pos)
    local rot = quatFromDir(-dir:cross(up):cross(up), up) -- minus sign is due to convention used by safeTeleport
    if dir then
      local rot = quatFromDir(dir:cross(up):cross(up), up)
      obj:queueGameEngineLua(
@/lua/ge/extensions/scenario/raceMarkers/overhead.lua
    --local side = fwd:cross(vec3(0,0,1))
    local rot = quatFromDir(fwd:z0()):toTorqueQuat()
    self.arrow:setField('rotation', 0, rot.x .. ' ' .. rot.y .. ' ' .. rot.z .. ' ' .. rot.w)
@/lua/ge/extensions/core/checkpoints.lua
  local upVec = vehicleCheckpoints[vehId].upVec
  local rot = quatFromDir(-dirVec, upVec)
  -- log('I', logTag, 'dirVec: '..tostring(dirVec))
@/lua/ge/extensions/scenario/busdriver.lua
    local currJer = (prevAcc and (currAcc - prevAcc) or vec3()) / dtSim
    local acc = currAcc:rotated(quatFromDir(fwd, up):inversed():normalized())
    if not smootherAcc then smootherAcc = newTemporalSmoothing(15, 5) end
    currPos = currPos + vec3(pv:getNodePosition(0))
    local diff = (currPos-busStopPos):rotated(quatFromDir(fwd, up):inversed():normalized())
    local stopDistance = diff.y
@/lua/ge/extensions/ui/liveryEditor/camera.lua
  core_camera.setPosition(0, layer.camPosition + veh:getPosition())
  core_camera.setRotation(0, quatFromDir(layer.camDirection))
end
@/lua/ge/extensions/core/cameraModes/crash.lua
    data.res.pos = driverPos
    data.res.rot = quatFromDir(bb1:getCenter() - driverPos)
    data.res.fov = 40
      data.res.pos = self.hitPoint + self.camOffset
      data.res.rot = quatFromDir(-self.camOffset)
      data.res.fov = 50
      data.res.pos = vec3(self.camPos)
      data.res.rot = quatFromDir(self.hitPoint - self.camPos)
      data.res.fov = self.fov
@/lua/ge/extensions/gameplay/discover/discover_037.lua
          local pos = vehicle:getPosition()
          local rot = quatFromDir(vehicle:getDirectionVector(), vehicle:getDirectionVectorUp())
          -- Create a point at the bottom center in local space (Z is up/down)
@/lua/ge/extensions/editor/crawlEditor/boundaries.lua
    if editor.getAxisGizmoAlignment() == editor.AxisGizmoAlignment_Local then
      local q = quatFromDir(quatFromEuler(0, math.pi / 2, 0) * self.currentPlane.normal, vec3(0, 0, 1))
      rotation = QuatF(q.x, q.y, q.z, q.w)
  if self.currentPlane then
    self.beginDragRotation = deepcopy(quatFromDir(quatFromEuler(0, math.pi / 2, 0) * self.currentPlane.normal, vec3(0, 0, 1)))
  end
@/lua/ge/extensions/editor/api/camera.lua
  local pos = core_camera.getPosition()
  core_camera.setRotation(0, quatFromDir(pt - pos))
end
  local pos = center + rot * vec3(0, -15, 0)
  local rot = quatFromDir(center - pos)
  core_camera.setPosRot(0, pos.x, pos.y, pos.z, rot.x, rot.y, rot.z, rot.w)
    local tempTarget = camVars.camStartPos +  step * currentStepPos
    local rot = quatFromDir(camVars.center - camVars.camEndPos)
    core_camera.setPosRot(0, tempTarget.x, tempTarget.y, tempTarget.z, rot.x, rot.y, rot.z, rot.w)
@/lua/ge/extensions/flowgraph/nodes/gameplay/sites/location.lua
          self.pinOut.roadSide.value = (closest.pos + (self._location.pos - closest.pos):normalized() * (closest.radius-2)):toTable()
          self.pinOut.roadDir.value = quatFromDir(closest.a.pos - closest.b.pos, vec3(0,0,1)):toTable()
        else
@/lua/ge/extensions/flowgraph/nodes/scene/camera/procedural/procDirectPath.lua
    fwd = fwd:normalized()
    local fq = quatFromEuler(math.pi / 4, 0, 0) * quatFromDir(fwd)
    local d = fq * vec3(0, -12, 0)

    mid.rot = (quatFromEuler(math.pi * 0.3, 0, 0) * quatFromDir(fwd)):slerp(quatFromDir(tt, tu), 1)
    mid.time = duration / 14 * 7

    mid.rot = (quatFromEuler(math.pi * 0.3, 0, 0) * quatFromDir(fwd)):slerp(quatFromDir(tt, tu), 1)
    mid.time = duration / 14 * 7
    mid2.pos = mid.pos
    mid2.rot = quatFromDir(tt, tu)
    mid2.time = duration / 14 * 10.5
        out.pos = mid.pos
        out.rot = quatFromDir(tt, tu)
        out.time = duration / 14 * 15.5
@/lua/ge/extensions/core/cameraModes/fallback.lua
  data.res.pos = data.res.pos or data.pos            -- camera position
  data.res.rot = data.res.rot or quatFromDir(data.pos) -- direction towards target
end
@/lua/ge/extensions/gameplay/rally/driveline/drivelineV3.lua
    local actualUp = right:cross(dir):normalized()
    local quat = quatFromDir(dir, actualUp)
@/lua/ge/extensions/flowgraph/nodes/vehicle/recoverInPlace.lua
    veh:resetBrokenFlexMesh()
    spawn.safeTeleport(veh, veh:getPosition(),quatFromDir(veh:getDirectionVector(), veh:getDirectionVectorUp()))
  end
@/lua/ge/extensions/editor/toolUtilities/util.lua
local globalDown = vec3(0, 0, -1)
local camLookDownRot = quatFromDir(globalDown)
@/lua/ge/extensions/editor/util/transformUtil.lua

    local rot = quatFromDir(fwd, mouseInfo._downNormal):normalized()
    self:set(mouseInfo._downPos,
  local fwd = (self.rot * vec3(0,1,0)):projectToOriginPlane(terrainNormal)
  self:set(nil, quatFromDir(fwd, terrainNormal))
end
@/lua/ge/extensions/editor/raceEditor.lua
              local sp = newPath.startPositions:create()
              sp:set(pn.pos, quatFromDir(pn.normal):normalized())
              sp.name = pn.name .. " Recovery Forward"
              local spr = newPath.startPositions:create()
              spr:set(pn.pos, quatFromDir(pn.normal*-1):normalized())
              spr.name = pn.name .. " Recovery Reverse"
@/lua/ge/extensions/flowgraph/nodes/vehicle/alignForCoupling.lua
        if self.pinIn.relativeRotationQuat.value then
          desiredRot = desiredRot * quatFromDir(vec3(v1:getDirectionVector()), vec3(v1:getDirectionVectorUp()))
        else
@/lua/ge/extensions/scenario/raceMarkers/ringMarker.lua
  local fwd = self.normal and self.normal or vec3(0,0,1)
  local rot = quatFromDir(fwd:z0()):toTorqueQuat()
    local up = wp.up or vec3(0,0,1)
    local rot = quatFromDir(fwd, up):toTorqueQuat()
    self.ring:setField('rotation', 0, rot.x .. ' ' .. rot.y .. ' ' .. rot.z .. ' ' .. rot.w)
@/lua/ge/extensions/scenario/raceMarkers/sideMarker.lua
  local fwd = self.normal and self.normal or (playerPosition-self.pos)
  local rot = quatFromDir(fwd:z0()):toTorqueQuat()
@/lua/ge/extensions/core/funstuff.lua
  local pos = vehicle:getPosition()
  local rot = quatFromDir(vehicle:getDirectionVector(), vehicle:getDirectionVectorUp())
  -- Create a point at the bottom center in local space (Z is up/down)
@/lua/ge/extensions/core/cameraModes/unicycle.lua
local function getRotVecFromFrontUp(front, up)
  local initialLookDir = quatFromDir(front, up)
  local rotEuler = initialLookDir:toEulerYXZ()
@/lua/ge/extensions/career/modules/painting.lua
    core_vehicleBridge.executeAction(getPlayerVehicle(0),'setFreeze', false)
    gameplay_walk.setWalkingMode(true, walkingPositionBefore, quatFromDir(vehPos - walkingPositionBefore))
    walkingPositionBefore = nil
@/lua/ge/extensions/editor/raceEditor/pacenotes.lua
    if editor.getAxisGizmoAlignment() == editor.AxisGizmoAlignment_Local then
      local q = quatFromDir(note.normal, vec3(0,0,1))
      rotation = QuatF(q.x, q.y, q.z, q.w)
  if note.normal then
    self.beginDragRotation = deepcopy(quatFromDir(note.normal, vec3(0,0,1)))
  end
@/lua/ge/extensions/scenario/waypoints.lua
      local vehiclePos = vehicle:getPosition()
      local vRot = quatFromDir(vehicle:getDirectionVector(), vehicle:getDirectionVectorUp())
      local x,y,z = vRot * vec3(1,0,0),vRot * vec3(0,1,0),vRot * vec3(0,0,1)
    local vPos = vehicle:getPosition()
    local vRot = quatFromDir(vehicle:getDirectionVector(), vehicle:getDirectionVectorUp())
    for i, corner in ipairs(vehWpData.wheelOffsets) do
@/lua/ge/extensions/flowgraph/nodes/scene/camera/cameraCircle.lua

  local q = quatFromDir(self.centerPos - self.camPos, vecUp)
  core_camera.setPosRot(0, self.camPos.x, self.camPos.y, self.camPos.z, q.x, q.y, q.z, q.w)
@/lua/ge/extensions/editor/crawlEditor/startingPositions.lua
          -- Create rotation from direction and surface normal
          local rot = quatFromDir(fwd, self._placementTemp.downNormal):normalized()
          self.startingPosition.transform.rotation = rot
@/lua/ge/extensions/editor/sensorConfigurationEditor.lua
  local dir, up = util.sensor2VS(s.dir, s.up, veh)
  beginDragRotation = quatFromDir(dir, up)
end
    local dir, up = util.sensor2VS(s.dir, s.up, veh)
    local q = quatFromDir(dir, up)
    rotation = QuatF(q.x, q.y, q.z, q.w)
@/lua/vehicle/scriptai.lua

  local rot = quatFromDir(dir:cross(up):cross(up), up)
      obj:queueGameEngineLua("getObjectByID(" .. tostring(obj:getId()) .. "):resetBrokenFlexMesh()")
      local rot = quatFromDir(dir:cross(up):cross(up), up)
      obj:queueGameEngineLua("getObjectByID(" .. obj:getId() .. "):autoplace(false);vehicleSetPositionRotation(" .. obj:getId() .. "," .. pos.x .. "," .. pos.y .. "," .. pos.z .. "," .. rot.x .. "," .. rot.y .. "," .. rot.z .. "," .. rot.w .. ")")
@/lua/ge/ge_utils.lua
      camDir.z = 0
      options.rot = quatFromDir(camDir)
    else
    else
      options.rot = quatFromDir(vec3(playerVehicle:getDirectionVector()):normalized(), vec3(playerVehicle:getDirectionVectorUp()):normalized())
    end
@/lua/ge/extensions/core/cameraModes/relative.lua
  local up = dir:cross(left):normalized()
  local qdir = quatFromDir(dir, up)
    data.res.pos = data.pos
    data.res.rot = quatFromDir(vec3(0,1,0), vec3(0, 0, 1))
    if self.nearClip then data.res.nearClip = self.nearClip end
@/lua/ge/extensions/editor/trafficManager.lua
  vehData.vehType = core_vehicles.getModel(vehData.model).model.Type
  vehData.home = vehData.home or {pos = veh:getPosition(), rot = quatFromDir(veh:getDirectionVector(), veh:getDirectionVectorUp())} -- reset transform
  vehData.aiType = vehData.aiType or "basic" -- basic, script, target, user
        spawnOptions.pos = anchorPos
        spawnOptions.rot = quatFromDir(vecY:rotated(quatFromDir((mousePos - anchorPos):normalized(), vecUp)), vecUp)
        spawnOptions.pos = anchorPos
        spawnOptions.rot = quatFromDir(vecY:rotated(quatFromDir((mousePos - anchorPos):normalized(), vecUp)), vecUp)
            spawnOptions.pos = spawnPos
            spawnOptions.rot = quatFromDir(spawnDir, vecUp)
          else  -- road found, no lanes : road direction for spawning
            spawnOptions.pos = anchorPos  -- use anchorPos as spawnPos; consider if the computed value is better
            spawnOptions.rot = quatFromDir(spawnDir, vecUp)
          end
          -- if no road found, then use the camera direction - update spawnOptions.rot
          spawnOptions.rot = quatFromDir(core_camera.getForward(), vecUp)
        end
      currVeh:queueLuaCommand('recovery.saveHome()')
      sessionData.home = {pos = currVeh:getPosition(), rot = quatFromDir(currVeh:getDirectionVector(), currVeh:getDirectionVectorUp())}
      editor.showNotification("Updated home position of current vehicle.")
        pos = currVeh:getPosition(),
        rot = quatFromDir(currVeh:getDirectionVector(), currVeh:getDirectionVectorUp()),
        model  = currVeh.jbeam,
      pos.x, pos.y, pos.z = options.objPos[0], options.objPos[1], options.objPos[2]
      spawn.safeTeleport(currVeh, pos, quatFromDir(currVeh:getDirectionVector(), currVeh:getDirectionVectorUp()), nil, nil, false, true)
    end
      dirVec.x, dirVec.y, dirVec.z = options.objRot[0], options.objRot[1], options.objRot[2]
      spawn.safeTeleport(currVeh, currVeh:getPosition(), quatFromDir(dirVec, vecUp), nil, nil, false, true)
    end
      if mouseHandler("Click and drag to move object to here") then
        spawn.safeTeleport(currVeh, anchorPos, quatFromDir((mousePos - anchorPos):normalized(), vecUp), nil, nil, false, true)
        shiftLock = false
            pos = pos + currInstance.dir:cross(vecUp) * (offset + 1)
            local rot = quatFromDir(currInstance.dir:z0(), vecUp)
            local obj = currInstance:createSignalObject("art/shapes/objects/s_trafficlight_boom_sn.dae", pos, rot)
        spawnOptions.pos = anchorPos
        spawnOptions.rot = quatFromDir(vecY:rotated(quatFromDir((mousePos - anchorPos):normalized(), vecUp)), vecUp)
      else
        spawnOptions.pos = anchorPos
        spawnOptions.rot = quatFromDir(vecY:rotated(quatFromDir((mousePos - anchorPos):normalized(), vecUp)), vecUp)
      else
        local obj = scenetree.findObject(nameId)
        spawn.safeTeleport(obj, obj:getPosition(), quatFromDir(obj:getDirectionVector(), obj:getDirectionVectorUp()), nil, nil, false, true)