Ваш код уже содержит основу для реализации инструмента, который рисует плоскость между двумя точками, однако есть несколько моментов, которые нужно скорректировать, чтобы плоскость отображалась правильно и располагалась между двумя точками. Давайте немного изменим ваш код:
1. Убедитесь, что вы правильно вычисляете среднюю точку между `point1` и `point2`.
2. Используйте правильный вектор нормали для ориентации плоскости.
3. Разместите плоскость таким образом, чтобы она корректно отображалась между этими двумя точками.
Вот пример того, как можно улучшить ваш код:
```lua
TOOL.Category = "Koshmarov"
TOOL.Name = "Plane Tool"
TOOL.Command = nil
TOOL.ConfigName = ""
if SERVER then return end
local function DrawPlaneBetweenPoints(point1, point2, ent, normal)
local midPoint = (point1 + point2) / 2 -- Вычисляем среднюю точку
local dff = (point2 - point1):Length() -- Длина между точками
-- Рассчитаем угол, чтобы плоскость ориентировалась правильно
local angle = normal:Angle()
cam.Start3D2D(ent:LocalToWorld(midPoint), ent:LocalToWorldAngles(angle), 1)
-- Учитываем ширину плоскости (например, 10)
surface.DrawRect(-dff / 2, -5, dff, 10)
cam.End3D2D()
end
function TOOL:LeftClick(trace)
if not IsValid(trace.Entity) then return end
local ent = trace.Entity
if not self.point1 then
print("point1 set")
self.point1 = trace.Entity:WorldToLocal(trace.HitPos)
self.hitnormal = trace.HitNormal
else
print("point2 set")
self.point2 = trace.Entity:WorldToLocal(trace.HitPos)
-- Удалим старый хук, если он существует
if self.drawHook then
hook.Remove("PostDrawOpaqueRenderables", self.drawHook)
end
-- Создаём новый уникальный хук
self.drawHook = "DrawPlane"
hook.Add("PostDrawOpaqueRenderables", self.drawHook, function()
render.SetColorMaterial()
DrawPlaneBetweenPoints(self.point1, self.point2, ent, self.hitnormal)
end)
-- Сбрасываем точки для следующего использования
self.point1, self.point2, self.hitnormal = nil, nil, nil
end
end
```
### Ключевые изменения:
1. **Средняя точка**: Мы вычислили среднюю точку между `point1` и `point2` для правильного расположения плоскости.
2. **Ориентация плоскости**: Плоскость теперь ориентируется по нормали пути к объекту.
3. **Очистка хуков**: Мы удалили старый хук перед добавлением нового, чтобы избежать конфликтов.
4. **Сброс переменных**: В конце метода `LeftClick` сбрасываем `point1`, `point2` и `hitnormal` для следующего использования.
Теперь вы можете кликнуть на объект дважды, чтобы установить две точки, и плоскость между ними будет отображаться правильно.