 |
10.06.2011, 13:53
|
#1
|
Знающий
Регистрация: 08.11.2010
Адрес: Москва
Сообщений: 285
Написано 78 полезных сообщений (для 182 пользователей)
|
Проблема пика линий
Здравствуйте. Возникла следующая проблема: требуется пикнуть линию нарисованную с помощью FatImage. Cкрин:
Кусок кода:
Function DrawMove(Entity%, size# = 5)
x = EntityX(Entity%)
y = EntityY(Entity%)
z = EntityZ(Entity%)
dist# = EntityDistance(Entity%, EditorCam)/size#
SetColor 0, 255, 0
Line3d(editorcam% , x, y, z, 0, dist#, z)
SetColor 0, 0, 0
DrawText("Y", ProjectedX#(), ProjectedY#())
SetColor 255, 0, 0
Line3d(editorcam% , x, y, z, dist#, y, z)
SetColor 0, 0, 0
DrawText("X", ProjectedX#(), ProjectedY#())
SetColor 0, 0, 255
Line3d(editorcam% , x, y, z, x, y, dist#)
SetColor 0, 0, 0
DrawText("Z", ProjectedX#(), ProjectedY#())
End Function
Function Line3d(cam% , x#, y#, z#, xw#, yw#, zw#)
CameraProject cam,x#,y#,z#
Gx = ProjectedX#()
Gy = ProjectedY#()
CameraProject cam,xw#,yw#,zw#
Gxw = ProjectedX#()
Gwy = ProjectedY#()
DrawLine Gx, Gy, Gxw, Gwy
End Function
|
В общем прошу помочь. К сожалению самостоятельно соображать не могу, мешает один ворвавшийся в дом человек.
Заранее благодарю.
|
(Offline)
|
|
10.06.2011, 14:53
|
#2
|
|
Ответ: Проблема пика линий
Рисуй линии цилиндрами и пикай их CameraPick
|
|
|
Сообщение было полезно следующим пользователям:
|
|
10.06.2011, 15:01
|
#3
|
Знающий
Регистрация: 08.11.2010
Адрес: Москва
Сообщений: 285
Написано 78 полезных сообщений (для 182 пользователей)
|
Ответ: Проблема пика линий
Рисуй линии цилиндрами и пикай их CameraPick
|
Если так, то лучше параллелепипедами.
Не катит, на то свои причины. 
|
(Offline)
|
|
10.06.2011, 15:25
|
#4
|
Разработчик
Регистрация: 06.06.2011
Адрес: Ирк. обл.
Сообщений: 543
Написано 133 полезных сообщений (для 220 пользователей)
|
Ответ: Проблема пика линий
В Xors3D есть samples Редактора ))) Посмотри там как сделано да и все...

Include "xors3d.bb"
xSetAntiAliasType xGetMaxAntiAlias()
xAppTitle "Editor sample"
xGraphics3D 800, 600, 32, False, True
xAntiAlias True
camera = xCreateCamera()
xCameraClsColor camera, 192, 192, 192
xPositionEntity camera, 10, 10, 10
light = xCreateLight()
cube = xCreateCube()
xPointEntity camera, cube
logoTexture = xLoadTexture("..\..\media\textures\logo.jpg")
xEntityTexture cube, logoTexture
controlType = 0 ;/ 0 - move, 1 - rotate, 2 - scale
selectMask = 0
deltaX# = 1.0
deltaY# = 1.0
deltaZ# = 1.0
scaleXInit# = 1.0
scaleYInit# = 1.0
scaleZInit# = 1.0
Global controllPosX# = 0.0
Global controllPosY# = 0.0
Global controllPosZ# = 0.0
Global mouseSpeedX = 0
Global mouseSpeedY = 0
Global used_controller$ = ""
; main program loop
While Not xKeyDown(KEY_ESCAPE)
xColor 100, 0, 0
mouseSpeedX = xMouseXSpeed()
mouseSpeedY = xMouseYSpeed()
; camera control
If xKeyDown(KEY_W) Then xMoveEntity camera, 0, 0, 1
If xKeyDown(KEY_S) Then xMoveEntity camera, 0, 0, -1
If xKeyDown(KEY_A) Then xMoveEntity camera, -1, 0, 0
If xKeyDown(KEY_D) Then xMoveEntity camera, 1, 0, 0
If xKeyHit(KEY_1) Then controlType = 0
If xKeyHit(KEY_2) Then controlType = 1
If xKeyHit(KEY_3) Then controlType = 2
; render scene
xRenderWorld()
; draw grid
xDrawGrid(0, 0, 5, 100);
; draw gizmos
x# = xEntityX(cube)
y# = xEntityY(cube)
z# = xEntityZ(cube)
Select controlType
Case 0
mask = xCheckMovementGizmo(x#, y#, z#, camera, xMouseX(), xMouseY())
If Not xMouseDown(1)
selectMask = mask
controllPosX = x
controllPosY = y
controllPosZ = z
EndIf
xDrawMovementGizmo(x#, y#, z#, selectMask)
used_controller$ = "Used move controler"
Case 1
mask = xCheckRotationGizmo(x#, y#, z#, camera, xMouseX(), xMouseY())
If Not xMouseDown(1)
selectMask = mask
controllPosX = x
controllPosY = y
controllPosZ = z
deltaX# = 0.0
deltaY# = 0.0
deltaZ# = 0.0
EndIf
xDrawRotationGizmo(x#, y#, z#, selectMask, deltaX, deltaY, deltaZ)
used_controller$ = "Used rotate controler"
Case 2
mask = xCheckScaleGizmo(x#, y#, z#, camera, xMouseX(), xMouseY())
If Not xMouseDown(1)
selectMask = mask
controllPosX = x
controllPosY = y
controllPosZ = z
deltaX = 1.0
deltaY = 1.0
deltaZ = 1.0
scaleXInit = xEntityScaleX(cube)
scaleYInit = xEntityScaleY(cube)
scaleZInit = xEntityScaleZ(cube)
EndIf
xDrawScaleGizmo(x#, y#, z#, selectMask, deltaX, deltaY, deltaZ)
used_controller$ = "Used scale controler"
Default
used_controller$ = ""
End Select
; object control
If xMouseDown(1) And selectMask <> 0
useX = (selectMask Shr 0) And 1
useY = (selectMask Shr 1) And 1
useZ = (selectMask Shr 2) And 1
useG = (selectMask Shr 3) And 1
factorX# = 0.7 / Float(xGraphicsWidth())
factorY# = 0.7 / Float(xGraphicsHeight())
Select controlType
; if movement gizmo is used
Case 0
; move controlled entity
dx# = controllPosX - xEntityX(camera, True)
dy# = controllPosY - xEntityY(camera, True)
dz# = controllPosZ - xEntityZ(camera, True)
dist# = Sqr(dx * dx + dy * dy + dz * dz)
; x-axis
If useX
move# = ComputeMove(camera, 10.0, 0.0, 0.0) * factorX * dist
xTranslateEntity cube, move, 0.0, 0.0, False
EndIf
; y-axis
If useY
move# = ComputeMove(camera, 0.0, 10.0, 0.0) * factorY * dist
xTranslateEntity cube, 0.0, move, 0.0, False
EndIf
; z-axis
If useZ
move# = ComputeMove(camera, 0.0, 0.0, 10.0) * factorX * dist
xTranslateEntity cube, 0.0, 0.0, move, False
EndIf
; if scaling gizmo is used
Case 2
; scale controlled entity
dx# = controllPosX - xEntityX(camera, True)
dy# = controllPosY - xEntityY(camera, True)
dz# = controllPosZ - xEntityZ(camera, True)
dist# = Sqr(dx * dx + dy * dy + dz * dz)
; x-axis
If useX
move# = ComputeMove(camera, 10.0, 0.0, 0.0) * factorX * dist
deltaX = deltaX + move
scaleXInit = scaleXInit + move
xScaleEntity cube, scaleXInit, scaleYInit, scaleZInit
EndIf
; y-axis
If useY
move# = ComputeMove(camera, 0.0, 10.0, 0.0) * factorY * dist
deltaY = deltaY + move
scaleYInit = scaleYInit + move
xScaleEntity cube, scaleXInit, scaleYInit, scaleZInit
EndIf
; z-axis
If useZ
move# = ComputeMove(camera, 0.0, 0.0, 10.0) * factorX * dist
deltaZ = deltaZ + move
scaleZInit = scaleZInit + move
xScaleEntity cube, scaleXInit, scaleYInit, scaleZInit
EndIf
; if rotation gizmo is used
Case 1
; rotate controlled entity
; x-axis
If useX
move# = ComputeMove(camera, 0.0, -10.0, 0.0)
deltaX = deltaX + move
xTurnEntity cube, move, 0.0, 0.0, True
EndIf
; y-axis
If useY
move# = ComputeMove(camera, -10.0, -10.0, 0.0);
deltaY = deltaY + move
xTurnEntity cube, 0.0, move, 0.0, True
EndIf
; z-axis
If useZ
move# = ComputeMove(camera, -10.0, 0.0, 0.0);
deltaZ = deltaZ + move
xTurnEntity cube, 0.0, 0.0, move, True
EndIf
End Select
EndIf
; draw info
xText 10, 10, "Use WSAD to move camera around scene"
xText 10, 30, "Use 1, 2, 3 to change object controler"
xText 10, 50, used_controller$
; switch back buffer
xFlip()
Wend
Function ComputeMove#(camera%, x#, y#, z#)
If mouseSpeedX = 0 And mouseSpeedY = 0 Then Return 0.0
; project axis on the screen
xCameraProject(camera, controllPosX, controllPosY, controllPosZ)
x1 = xProjectedX()
y1 = xProjectedY()
xCameraProject(camera, controllPosX + x, controllPosY + y, controllPosZ + z)
x2 = xProjectedX()
y2 = xProjectedY()
; compute angle between our vectors
dx1 = x2 - x1
dy1 = y2 - y1
dx2 = mouseSpeedX
dy2 = mouseSpeedY
len1# = Sqr(dx1 * dx1 + dy1 * dy1)
len2# = Sqr(dx2 * dx2 + dy2 * dy2)
angle# = ACos(Float(dx1 * dx2 + dy1 * dy2) / (len1 * len2))
; compute distance
radii# = Sqr(dx2 * dx2 + dy2 * dy2)
; compute a new vector's x-component
Return radii * Cos(angle)
End Function
|
(Offline)
|
|
10.06.2011, 16:10
|
#5
|
Элита
Регистрация: 16.01.2010
Адрес: Новосибирск
Сообщений: 2,158
Написано 502 полезных сообщений (для 1,012 пользователей)
|
Ответ: Проблема пика линий
учебник геометрии,смотри про вектора.....
|
(Offline)
|
|
10.06.2011, 16:19
|
#6
|
Знающий
Регистрация: 08.11.2010
Адрес: Москва
Сообщений: 285
Написано 78 полезных сообщений (для 182 пользователей)
|
Ответ: Проблема пика линий
учебник геометрии,смотри про вектора.....
|
Я на даче, учебников нет. Модем только булку грузит, Труъ!
|
(Offline)
|
|
10.06.2011, 16:21
|
#7
|
|
Ответ: Проблема пика линий
Сообщение от Leowey
Если так, то лучше параллелепипедами.
|
3-гранный цилиндр - 8 треугольников
куб - 12 треугольников
Сообщение от Leowey
Не катит, на то свои причины. 
|
Какие причины?
ЗЫ
Еще один + к цилиндрам - по ним куда проще попасть чем по тонким линиям
|
|
|
10.06.2011, 16:21
|
#8
|
Элита
Регистрация: 16.01.2010
Адрес: Новосибирск
Сообщений: 2,158
Написано 502 полезных сообщений (для 1,012 пользователей)
|
Ответ: Проблема пика линий
Я на даче, учебников нет. Модем только булку грузит, Труъ!
|
я всегда "на даче"
|
(Offline)
|
|
10.06.2011, 16:34
|
#9
|
Знающий
Регистрация: 08.11.2010
Адрес: Москва
Сообщений: 285
Написано 78 полезных сообщений (для 182 пользователей)
|
Ответ: Проблема пика линий
1) Высокая цена ентити
2) CameraPick медленно очень
3) Я что зря фастлибы покупал?
4) У меня в программе масштаб стрелок относительно камеры, с геометрией такое прокатит, но будет галюнить
Усё 
|
(Offline)
|
|
10.06.2011, 16:57
|
#10
|
|
Ответ: Проблема пика линий
Сообщение от Leowey
1) Высокая цена ентити
2) CameraPick медленно очень
3) Я что зря фастлибы покупал?
4) У меня в программе масштаб стрелок относительно камеры, с геометрией такое прокатит, но будет галюнить 
Усё 
|
1) Один меш и сурфейс на все стрелки
2) Правда что-ли?
3) А причем тут эти библиотеки?
4) ну тут да, прийдется повозиться
Ну попробуй вычислять расстояние от указателя мыши до линий стрелок, вот функция
целые числа, дистанция в квадрате
Function PointLineDistanceSquared(x%, y%, x1%, y1%, x2%, y2%)
Local dx% = x2 - x1
Local dy% = y2 - y1
Local t% = (((x - x1) * dx + (y - y1) * dy) Shl 8) / (dx * dx + dy * dy)
If t < 0 Then
dx = x1 - x
dy = y1 - y
Else If t > (1 Shl 8) Then
dx = x2 - x
dy = y2 - y
Else
dx = x1 + ((dx * t) Sar 8) - x
dy = y1 + ((dy * t) Sar 8) - y
End If
Return dx * dx + dy * dy
End Function
x, y - точка
x1, y1, x2, y2 - отрезок
|
|
|
Эти 2 пользователя(ей) сказали Спасибо за это полезное сообщение:
|
|
10.06.2011, 17:17
|
#11
|
Элита
Регистрация: 16.01.2010
Адрес: Новосибирск
Сообщений: 2,158
Написано 502 полезных сообщений (для 1,012 пользователей)
|
Ответ: Проблема пика линий
вот тебе и геометрия...
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
10.06.2011, 17:51
|
#12
|
Знающий
Регистрация: 08.11.2010
Адрес: Москва
Сообщений: 285
Написано 78 полезных сообщений (для 182 пользователей)
|
Ответ: Проблема пика линий
Всем спасибо, я уже придумал как реализовать.
__________________________________________
1) Один меш и сурфейс на все стрелки
2) Правда что-ли?
3) А причем тут эти библиотеки?
4) ну тут да, прийдется повозиться
|
1) Тут соглашусь
2)Ещё Автэ писал 
3)Я их купил и юзаю 
4) Да
_____________________________________
|
(Offline)
|
|
10.06.2011, 20:47
|
#13
|
Знающий
Регистрация: 08.11.2010
Адрес: Москва
Сообщений: 285
Написано 78 полезных сообщений (для 182 пользователей)
|
Ответ: Проблема пика линий
Еще один + к цилиндрам - по ним куда проще попасть чем по тонким линиям
|
Ы, я задал линиям "виртуальную толщину". вроде работает. 
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 02:08.
|