Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Anonymous

unregistriert

1

22.09.2004, 19:55

Einheiten auf 3DTerrain makieren?

Ersmal hallo
Ich bin noch ziemlich neu und unbeholfen in 3D programmierung mit DirectX.

Aber vielleicht kann mir jemand helfen!?
Ich versuche gerade zum Test so ein kleines 3D Echtzeitstartegiespiel mit der TriBase Engine zu basteln.
Jetzt zur frage wie schaffe ich es dass ich Einheiten aus einer leicht geneigten Ansicht anklicken kann.
Ich habe einmal was gelesen dass man das mit einem Strahl realisieren kann der von der Kamera ausgesendet wird.
Aber um einen Strahl auszusenden, um zu wissen das die Maus auf eine Einheit zeigt brauche ich doch 2 3D Koordinaten oder???
Also kann ich das schlecht mit einer 2D Maus auf dem Bildschirm realisieren!


Bin für jeden Lösungsvorschlag dankbar!!

big_muff

Alter Hase

Beiträge: 460

Wohnort: Schweiz

Beruf: Informatikstudent (4. Semester)

  • Private Nachricht senden

2

22.09.2004, 22:07

Da gabs schon mal einen ähnlichen Thread (Link). Ist zwar nicht genau das gleiche Thema, aber der Lösungsweg ist in etwa der gleiche. Ich hoffe das kann dir helden. :huhu:
Nur Idioten halten Ordnung, ein Genie beherrscht das Chaos.[size=7]

[/size]HardFate - Ein Start, Ein Ziel, Viele Wege[size=7]

[/size]Ein Mitglied der VEGeiCoUndGraSonMaWiGeS Bewegung.

Anonymous

unregistriert

3

23.09.2004, 17:47

Erstmal danke für den Post!

Aber hat mir nicht wirlklich viel gebracht wenigstens weis ich jetzt wie die Technick heißt! Dann werd ich mal schauen dass ich bei Google was über "Picking" finde!

unsigned int

Alter Hase

Beiträge: 512

Wohnort: Bonn

Beruf: Schüler; C#-Programmierer in einer kleinen Firma

  • Private Nachricht senden

4

23.09.2004, 17:50

guck dir mal die samples, die beim DirectX-SDK dabei sind, an... :) Vielleicht hilft dir das...
"Tu es. Oder tu es nicht. Es gibt kein Versuchen."
StarWars

www.tron2d.de.vu

Anonymous

unregistriert

5

23.09.2004, 21:49

Hmmm

Danke für den Tipp
Ich hab mir mal das pick sample vom DXSDK angeschaut und mir die Funktion rauskopiert und sie angepasst

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
D3DXMATRIXA16 matProj;
tbDirect3D::GetDevice()->GetTransform( D3DTS_PROJECTION, &matProj );

tbVector2 CursorPosition= m_pGUI->GetCursorPos();
        
POINT ptCursor;
ptCursor.x =  CursorPosition.x;
ptCursor.y =  CursorPosition.y;
ScreenToClient( tbDirect3D::GetWindow(), &ptCursor );

// Compute the vector of the pick ray in screen space

D3DXVECTOR3 v;
v.x =  ( ( ( 2.0f * ptCursor.x ) / m_d3dsdBackBuffer.Width  ) - 1 ) / matProj._11;
v.y = -( ( ( 2.0f * ptCursor.y ) / m_d3dsdBackBuffer.Height ) - 1 ) / matProj._22;
v.z =  1.0f;

 // Get the inverse view matrix

D3DXMATRIXA16 matView;
tbDirect3D::GetDevice()->GetTransform( D3DTS_VIEW, &matView );
m=tbMatrixInvert( matView );

// Transform the screen space pick ray into 3D space

vPickRayDir.x  = v.x*m.m11 + v.y*m.m21 + v.z*m.m31;
vPickRayDir.y  = v.x*m.m12 + v.y*m.m22 + v.z*m.m32;
vPickRayDir.z  = v.x*m.m13 + v.y*m.m23 + v.z*m.m33;
vPickRayOrig.x = m.m41;
vPickRayOrig.y = m.m42;
vPickRayOrig.z = m.m43;


und dann durch eine Line Hits Model Funktion von der Tribase Engine geschaut ob das Model auf dem Strahl liegt!

C-/C++-Quelltext

1
2
3
4
5
6
if(tbLineHitsModel(vPickRayOrig,vPickRayDir,BallModel,tbMatrixIdentity(),tbMatrixIdentity() ) )
{
g_pSpiel->m_pFont2->Begin();
g_pSpiel->m_pFont2->DrawText(tbVector2(0.5f, 0.05f),"Treffer", TB_FF_ALIGN_HLEFT | TB_FF_ALIGN_VCENTER | TB_FF_RELATIVE | TB_FF_RELATIVESCALING);
g_pSpiel->m_pFont2->End();
}


Leider Funktioniert es nicht?!

Vielleicht kann mir jemand sagen was ich falsch mache wie gesagt ich bin noch ein Neuling in der Programierung mit DirectX und der Tribase Engine!

6

24.09.2004, 13:08

äh, vieleicht wiel der Text nru eine Frame lang angezeigt wird?
Oder wegen der Identitätsmatrix, wenn das Objekt transformiert wurde, muss das doch auch mit dem Starhl geschehen?
Lieber dumm fragen, als dumm bleiben!

Anonymous

unregistriert

7

24.09.2004, 16:22

Nein also der Text wird definitiv richtig angezeigt (hab ich ausprobiert), hab sogar noch unten ne tbWriteToLog Funktion angefügt um es definitiv zu sehen ;
Und das Model wurde zuvor nur mit der Identitätsmatrix transformiert!

Bum

Frischling

Beiträge: 6

Wohnort: Aicha

Beruf: Schüler am Gym

  • Private Nachricht senden

8

25.09.2004, 14:38

Es geht

Also bin euch sehr dankbar jetzt gehts (mehr oder weniger)
ich hab den Fehler gefunden es war das

m_d3dsdBackBuffer.Width und
m_d3dsdBackBuffer.Height

die sind irgendwie nicht richtig definiert. ich hab einfach dafür geschrieben
640 und
480
und jetzt zeigt er mir ungefähr wenn ich in die richtung des Blockes mit der Maus zeige "Treffer" an.
Aber halt nur ungefähr. Wenn ich also 2cm drüber mit der Maus hinfahr zeigt er mir eben auch "Treffer" an, an was kann das liegen???

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

9

25.09.2004, 15:46

Re: Es geht

Zitat von »"Bum"«

und jetzt zeigt er mir ungefähr wenn ich in die richtung des Blockes mit der Maus zeige "Treffer" an.
Aber halt nur ungefähr. Wenn ich also 2cm drüber mit der Maus hinfahr zeigt er mir eben auch "Treffer" an, an was kann das liegen???

Lass mal das mit dem "ScreenToClient" weg. Das wird nur gebraucht, wenn Du den normalen Windows-Mauszeiger nimmst, hier macht es nur Probleme. Lösche also die Zeile mit ScreenToClient.

Bum

Frischling

Beiträge: 6

Wohnort: Aicha

Beruf: Schüler am Gym

  • Private Nachricht senden

10

25.09.2004, 16:21

Hab ich gemacht aber es hat sich nichts gerändert dadurch!
Das Problem besteht weiterhin!

Werbeanzeige