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

LukasBanana

Alter Hase

  • »LukasBanana« ist der Autor dieses Themas

Beiträge: 1 097

Beruf: Shader Tools Programmer

  • Private Nachricht senden

1

27.02.2010, 10:28

Picking wie in Half-Life 2

Hi,
kann mir jemand sagen nach welchen Begriffen ich im Internet suchen muss, um heraus zu finden wie in Half-Life 2 oder ähnlichen Spielen das Picking funktioniert - also wenn man schießt, dass das Einschussloch (Quad) an einer Kante auch wirklich um die Kante herumführt und nicht absteht?

CBenni::O

1x Contest-Sieger

Beiträge: 1 145

Wohnort: Stuttgart

  • Private Nachricht senden

2

27.02.2010, 10:33

Es wird damit getan, dass ncht ein Sprite am einschussloch erstellt wird, sonder mit Multitexturing oder Render to Texture.

So fügt sich das Loch schön an die Geometrie an.

Und zur Kollisionsafrage: einfach eine Strahl in Projektilrichtung abschießen und gucken, wo er als erstes ein Objekt trifft.

mfg CBenni::O
Ein Mitglied der VEGeiCoUndGraSonMaWiGeS Bewegung.
42!
Aufräumen kann jeder, nur das Genie überblickt das Chaos!
Metal will never die!
1. Sppro Gamecontest - mein Beitrag

LukasBanana

Alter Hase

  • »LukasBanana« ist der Autor dieses Themas

Beiträge: 1 097

Beruf: Shader Tools Programmer

  • Private Nachricht senden

3

27.02.2010, 13:27

Ich weiß zwar nicht wie die Berechnungen in Half-Life 2 aussehen, aber deine Beschreibung ist ganz sicher falsch.
Wenn man in Half-Life 2 oder Counter-Strike: Source den Wireframe mode aktiviert sieht man, dass es sich um Quads bzw. eine Viereckige Fläche handelt, die, wenn sie um eine Ecke geht, nochmal in zwei kleinere Quads aufgeteilt wird.
Ich weiß also ganz sicher, dass es sich nicht um multitexturing handelt.
Und außerdem, wie soll das mit Multitexturing gehen? Schließlich wird bei multitexturing jede Texture immer über das gesammte Mesh verteilt.
Gestreckt oder in Form von Tiles. Da gibt's zwar noch gewisse Einstellmöglichkeiten, aber die reichen nicht aus, um das für Einschusslöcher zu nutzen.
Weiß also sonst jemand wie das geht?

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

4

27.02.2010, 13:50

Naja sowas nennt sich Decal und wie es funktioniert hast du im Prinzip eh schon rausgefunden indem du dir den Wireframe angeschaut hast. Es wird halt ein kleines, entsprechend der darunterliegenden Oberfläche geformtes, Sprite gemacht und darauf is dann deine Decal-Textur (das Einschussloch) und das wird dann gerendert. Um z-Fighting zu vermeiden verwendet man zum Rendern von Decals normal den Stencil Buffer oder einen Depth Bias oder man packt das Sprite einfach mit einem sehr kleinen Offset vor die darunterliegenden Polygone.

Mit Multitexturing würde das übrigens theoretisch schon auch gehen, wäre allerdings nicht unbedingt effizient.

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

5

27.02.2010, 15:04

Ginge sowas nicht wunderschön mit Normal/Deferred shading?
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

6

27.02.2010, 15:19

Naja, man kann die Position auf dem Dreieck, das getroffen wurde berechnen, und dann die Dreieckskanten nehmen, um das Quad abzuschneiden. Der Teil, der dann noch übrig bleibt wird dementsprechend auf das danebenliegende Dreieck gepackt (und dann natürlich an dessen Normale ausgerichtet).

Decals vs. Multitexturing ist wohl auch eine Frage, von der Anzahl der Löcher. Wenn man recht wenig Wände hat, aber sehr viele Schüsse, ist es sicherlich schneller und effizienter, Multitexturing zu nehmen, d.h. im schlimmsten Fall für jedes Wandstück eine eigene Textur zu haben.
Generell sollte aber Decalls schneller sein.
Lieber dumm fragen, als dumm bleiben!

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

7

27.02.2010, 15:45

Du könntest folgendes versuchen:

o Intersectionpoint (P) berechnen
o Decalplane (E) ergibt sich aus der Surfacenormalen an P und P.
o Das Decal entsprechend E ausrichten
o Boundingplanes für das Decal erzeugen (zu berücksichtigen Breite und Höhe sowie für Near- und Farplane eine beliebige Distanz)
o Alle Dreiecke die nicht vom Decal beeinflusst werden können (außerhalb der Boundingbox, abgewandt, ...) verwerfen
o Alle übrigen Dreiecke an den Boundingplanes clippen und daraus ein neues Mesh erzeugen (beim Clippen Vertexattribute interpolieren)
o Texturcoordinaten für das neue Mesh erzeugen
o Alphawerte für die Meshvertices erzeugen (damit der Übergang zum Hintergrund schön fließend wird)
o Erzeuge Geometrie decalüblich (Z-Fighting Problematik berücksichtigen) rendern

In der Art macht das Quake3 und vermutlich auch Half Life 2 (die haben immer noch viel Quake Code in Verwendung ;)).

CBenni::O

1x Contest-Sieger

Beiträge: 1 145

Wohnort: Stuttgart

  • Private Nachricht senden

8

27.02.2010, 21:00

Zitat von »"dot"«

Naja sowas nennt sich Decal und wie es funktioniert hast du im Prinzip eh schon rausgefunden indem du dir den Wireframe angeschaut hast. Es wird halt ein kleines, entsprechend der darunterliegenden Oberfläche geformtes, Sprite gemacht und darauf is dann deine Decal-Textur (das Einschussloch) und das wird dann gerendert. Um z-Fighting zu vermeiden verwendet man zum Rendern von Decals normal den Stencil Buffer oder einen Depth Bias oder man packt das Sprite einfach mit einem sehr kleinen Offset vor die darunterliegenden Polygone.

Mit Multitexturing würde das übrigens theoretisch schon auch gehen, wäre allerdings nicht unbedingt effizient.


Achso? In David's Buch wurde es so beschrieben...

Na gut...

mfg CBenni::O
Ein Mitglied der VEGeiCoUndGraSonMaWiGeS Bewegung.
42!
Aufräumen kann jeder, nur das Genie überblickt das Chaos!
Metal will never die!
1. Sppro Gamecontest - mein Beitrag

9

02.03.2010, 19:09

In meiner Engine habe ich die wohl "Picking" genannte (wusste ich nich)
schon eingebaut - dafür habe ich allerdings Projektoren verwendet.

Dazu braucht man Shader - ist aber glaube ich einfacher zu implementieren.
Hier ein Bild:
http://dl.dropbox.com/u/4251611/bosf.bmp
Ist zwar kein Einschlagskrater, zeigt aber wie es am Ende aussieht.

Und hier ist der Shader-Code:

Globale Variablen:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#define MAX_PROJECTORS 6
float4x4    mProjector [MAX_PROJECTORS];
float   fProjectorRange [MAX_PROJECTORS];
TEXTURE ProjectorTexture;
int iNumberOfProjectors;

// Noch n Sampler

sampler SS_ProjectorTexture = sampler_state 
{ 
    Texture = <ProjectorTexture>;
    MINFILTER = LINEAR; 
    MAGFILTER = LINEAR; 
    MIPFILTER = LINEAR; 
};

Im Pixel-Shader:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
float4 ProjColor = float4(0, 0, 0, 1);
for (int p = 0; p < MAX_PROJECTORS && p < iNumberOfProjectors; p++)
{
    // In das Koordinatensystem des Projektors  transformieren

    float4 RelPos = mul (vInPos, mProjector [p]);
    RelPos /= RelPos.w;
    float2 TexCoord;
    TexCoord.x        = 0.5f * RelPos.x + 0.5f; 
    TexCoord.y        = 0.5f - 0.5f * RelPos.y; 
    if(TexCoord.x < 1 && TexCoord.x > 0 && TexCoord.y < 1 &&    TexCoord.y >0 && RelPos.z > 0)
    {
        float4 Color = tex2D(SS_ProjectorTexture,TexCoord);
        ProjColor += Color * (1-min (1, RelPos.z / fProjectorRange[p]));
    }
}


vInPos ist die nur mit der Weltmatrix transformierte Vertex-Position.

mProjector [n] muss die Sicht*Projektionsmatrix des Projektors n beeinhalten
fProjectorRange [n] ist die Reichweite des Projektors n
ProjectorTexture deine Decal-Textur
iNumberOfProjectors die Anzahl der Projektoren, die dieses Objekt beeinflussen.

Vor dem Rendern eines Objektes, auf dem Decal sichbar sein soll,
muss man erst die Projektoren heraussuchen, die das Objekt beeinflussen.
Z-Fighting gibt's nicht.

Okay, es ist kein toller Shader.
Aber mit ein bisschen Optimierungsarbeit kann man da schon was rausholen, beispielsweise kann man das ausrechnen der Texturkoordinaten im Vertex-Shader erledigen. ;)

Ist ja eh nur zum veranschaulichen.

Ich hoffe du kannst was damit anfangen.

comp

little_Progger

Treue Seele

Beiträge: 188

Wohnort: Nähe Bielefeld

Beruf: Azubi

  • Private Nachricht senden

10

27.03.2010, 23:22

is zwar schon ein bisel älter der theard hier aber ich dachte mir, dass dieser Link hier vll. bisel hilft.

http://developer.valvesoftware.com/wiki/SDK_Docs

vll. findet ihr ja was passendes und wenn nicht dann halt irgend was anderes was ihr davon verwenden könnt ;)

Werbeanzeige