Jump to content

processLineOfSight - нормали, createObject - углы


Recommended Posts

sx, sy = guiGetScreenSize()
movedClip = false
testAngle = 0

function math.rotVecToEular(x, y, z, rot)  -- Описано на вики Мта
	local rotx = math.deg( math.atan2 ( z, (x^2+y^2)^0.5 ) ) % 360
	local rotz = math.deg( math.atan2( x, y ) ) % 360
	return rotx, rot, rotz
end

addEventHandler("onClientRender", root, function ()
	local relX, relY = getCursorPosition()
    local cursorX, cursorY = relX * sx, relY * sy
    local camX, camY, camZ = getCameraMatrix()
    local cursorWorldPosX, cursorWorldPosY, cursorWorldPosZ = getWorldFromScreenPosition(cursorX, cursorY, 20)
    hit, hitX, hitY, hitZ, hitElement, normalX, normalY, normalZ = processLineOfSight(camX, camY, camZ, cursorWorldPosX, cursorWorldPosY, cursorWorldPosZ, true, false, false, true, false, true, false, true)
	if hit then
      testAngle = (testAngle + 1) % 360
      angleVectorX, angleVectorY, angleVectorZ = math.rotVecToEular(normalX, normalY, normalZ, testAngle)
      angleVectorX = angleVectorX - 90 -- так конус смотрит "наверх"
      hitX = normalX*0.2 + hitX -- немного поднимаем объект относительно нормали
      hitY = normalY*0.2 + hitY -- немного поднимаем объект относительно нормали
      hitZ = normalZ*0.2 + hitZ -- немного поднимаем объект относительно нормали
	  if isElement(movedClip) then
         destroyElement(movedClip)
      end
      movedClip = createObject(1238, hitX, hitY, hitZ, angleVectorX, angleVectorY, angleVectorZ, true)
	end
end)

Я немного не понимаю, как перевести нормаль, которая возвращается в processLineOfSight, в аргументы углов для createObject. Происходит то-что объект вращается не по правильным координатам:

В итоге нужно получить вращение по нормали поверхности которое приходит от processLineOfSight.

Link to comment

Если кому не понятно чего я хочу добиться то вот что я получаю при createObject и вращении:

А нужно получить вот такое вращение:

Функция setElementRotation с 5-ым аргументом "ZXY" вообще никак не меняет ситуацию:
 

local angX = 0
local angY = 0
local angZ = 0
local modelToRotate = false
sx, sy = guiGetScreenSize()

addEventHandler("onClientRender", root, 
	function ()
		if isCursorShowing() then
      		local relX, relY = getCursorPosition()
			local cursorX, cursorY = relX * sx, relY * sy
			local camX, camY, camZ = getCameraMatrix()
			local cursorWorldPosX, cursorWorldPosY, cursorWorldPosZ = getWorldFromScreenPosition(cursorX, cursorY, 20)
			local hit, hitX, hitY, hitZ, hitElement, normalX, normalY, normalZ = processLineOfSight(camX, camY, camZ, cursorWorldPosX, cursorWorldPosY, cursorWorldPosZ, true, false, false, true, false, true, false, true)

			if isElement(modelToRotate) then
				destroyElement(modelToRotate)
			end
      		modelToRotate = createObject(1238, hitX, hitY, hitZ, 0, 0, 0, true)
      		setElementRotation(modelToRotate, angX, angY, angZ, "ZXY")
		end
	end
)

 

Link to comment
On 24/02/2023 at 21:06, AvatoR said:
local angX = 0
local angY = 0
local angZ = 0
local modelToRotate = false
sx, sy = guiGetScreenSize()

addEventHandler("onClientRender", root, 
	function ()
		if isCursorShowing() then
      		local relX, relY = getCursorPosition()
			local cursorX, cursorY = relX * sx, relY * sy
			local camX, camY, camZ = getCameraMatrix()
			local cursorWorldPosX, cursorWorldPosY, cursorWorldPosZ = getWorldFromScreenPosition(cursorX, cursorY, 20)
			local hit, hitX, hitY, hitZ, hitElement, normalX, normalY, normalZ = processLineOfSight(camX, camY, camZ, cursorWorldPosX, cursorWorldPosY, cursorWorldPosZ, true, false, false, true, false, true, false, true)

			if isElement(modelToRotate) then
				destroyElement(modelToRotate)
			end
      		modelToRotate = createObject(1238, hitX, hitY, hitZ, 0, 0, 0, true)
      		setElementRotation(modelToRotate, angX, angY, angZ, "ZXY")
		end
	end
)

 

Ты же тут не меняешь ротацию, она у тебя постоянно 0

Link to comment

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...