Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование игр для компьютеров > Blitz3D

Ответ
 
Опции темы
Старый 10.06.2011, 13:53   #1
Leowey
Знающий
 
Аватар для Leowey
 
Регистрация: 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
Venom2
 
Сообщений: n/a
Ответ: Проблема пика линий

Рисуй линии цилиндрами и пикай их CameraPick
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Leowey (10.06.2011)
Старый 10.06.2011, 15:01   #3
Leowey
Знающий
 
Аватар для Leowey
 
Регистрация: 08.11.2010
Адрес: Москва
Сообщений: 285
Написано 78 полезных сообщений
(для 182 пользователей)
Ответ: Проблема пика линий

Рисуй линии цилиндрами и пикай их CameraPick
Если так, то лучше параллелепипедами.


Не катит, на то свои причины.
(Offline)
 
Ответить с цитированием
Старый 10.06.2011, 15:25   #4
L-ee-X
Разработчик
 
Аватар для L-ee-X
 
Регистрация: 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
RegIon
Элита
 
Аватар для RegIon
 
Регистрация: 16.01.2010
Адрес: Новосибирск
Сообщений: 2,158
Написано 502 полезных сообщений
(для 1,012 пользователей)
Ответ: Проблема пика линий

учебник геометрии,смотри про вектора.....
__________________
Сайт: http://iexpo.ml
(Offline)
 
Ответить с цитированием
Старый 10.06.2011, 16:19   #6
Leowey
Знающий
 
Аватар для Leowey
 
Регистрация: 08.11.2010
Адрес: Москва
Сообщений: 285
Написано 78 полезных сообщений
(для 182 пользователей)
Ответ: Проблема пика линий

учебник геометрии,смотри про вектора.....


Я на даче, учебников нет. Модем только булку грузит, Труъ!
(Offline)
 
Ответить с цитированием
Старый 10.06.2011, 16:21   #7
Venom2
 
Сообщений: n/a
Ответ: Проблема пика линий

Сообщение от Leowey Посмотреть сообщение
Если так, то лучше параллелепипедами.
3-гранный цилиндр - 8 треугольников
куб - 12 треугольников

Сообщение от Leowey Посмотреть сообщение
Не катит, на то свои причины.
Какие причины?

ЗЫ
Еще один + к цилиндрам - по ним куда проще попасть чем по тонким линиям
 
Ответить с цитированием
Старый 10.06.2011, 16:21   #8
RegIon
Элита
 
Аватар для RegIon
 
Регистрация: 16.01.2010
Адрес: Новосибирск
Сообщений: 2,158
Написано 502 полезных сообщений
(для 1,012 пользователей)
Ответ: Проблема пика линий

Я на даче, учебников нет. Модем только булку грузит, Труъ!
я всегда "на даче"
__________________
Сайт: http://iexpo.ml
(Offline)
 
Ответить с цитированием
Старый 10.06.2011, 16:34   #9
Leowey
Знающий
 
Аватар для Leowey
 
Регистрация: 08.11.2010
Адрес: Москва
Сообщений: 285
Написано 78 полезных сообщений
(для 182 пользователей)
Ответ: Проблема пика линий

Какие причины?

1) Высокая цена ентити
2) CameraPick медленно очень
3) Я что зря фастлибы покупал?
4) У меня в программе масштаб стрелок относительно камеры, с геометрией такое прокатит, но будет галюнить



Усё
(Offline)
 
Ответить с цитированием
Старый 10.06.2011, 16:57   #10
Venom2
 
Сообщений: n/a
Ответ: Проблема пика линий

Сообщение от 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 пользователя(ей) сказали Спасибо за это полезное сообщение:
HolyDel (11.06.2011), Leowey (10.06.2011)
Старый 10.06.2011, 17:17   #11
RegIon
Элита
 
Аватар для RegIon
 
Регистрация: 16.01.2010
Адрес: Новосибирск
Сообщений: 2,158
Написано 502 полезных сообщений
(для 1,012 пользователей)
Ответ: Проблема пика линий

вот тебе и геометрия...
__________________
Сайт: http://iexpo.ml
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Leowey (10.06.2011)
Старый 10.06.2011, 17:51   #12
Leowey
Знающий
 
Аватар для Leowey
 
Регистрация: 08.11.2010
Адрес: Москва
Сообщений: 285
Написано 78 полезных сообщений
(для 182 пользователей)
Ответ: Проблема пика линий

Всем спасибо, я уже придумал как реализовать.

__________________________________________

1) Один меш и сурфейс на все стрелки
2) Правда что-ли?
3) А причем тут эти библиотеки?
4) ну тут да, прийдется повозиться
1) Тут соглашусь
2)Ещё Автэ писал
3)Я их купил и юзаю
4) Да

_____________________________________
(Offline)
 
Ответить с цитированием
Старый 10.06.2011, 20:47   #13
Leowey
Знающий
 
Аватар для Leowey
 
Регистрация: 08.11.2010
Адрес: Москва
Сообщений: 285
Написано 78 полезных сообщений
(для 182 пользователей)
Ответ: Проблема пика линий

Еще один + к цилиндрам - по ним куда проще попасть чем по тонким линиям

Ы, я задал линиям "виртуальную толщину". вроде работает.
(Offline)
 
Ответить с цитированием
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Часовой пояс GMT +4, время: 12:10.


vBulletin® Version 3.6.5.
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com