Jump to content
Unity Insider Forum

Einschusslöcher korrekt darstellen


Jog

Recommended Posts

Hallo,

Um z.b.  Einschusslöcher  auf einem Objekt darzustellen(Hier als Cube dargestellt) wenn ich dieses mit

 „ScreenPoinToRay()“ anklicke habe ich folgendes Problem. Wenn ich das darzustellende Objekt(als 1,2,3 dargestellt) mit „Instantiate()“ an dieser Stelle erzeuge und die ermittelten Transforms übergebe, wird es zwar korrekt an der Stelle erzeugt aber die Ausrichtungen sind nicht dieselben wie die der Flächen des Cube(Siehe Bild). Wie kann man dieses Problem am besten lösen.

Über ein Script Beispiel wäre ich dankbar.

Image1.jpg.b16a1a1214f65822ca6ac622fdd1fed8.jpg

 

Mit bestem Dank im Voraus

Jog

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 18 Minuten schrieb Kojote:

Ich kann mir irren aber man müsste es mit einem Ray abfragen können, ob der Ray bei +X, -X bzw. bei +Z, -Z getroffen wurde.

Schau mal hier:

Hallo,

Erst mal danke für deine Antwort.

Das habe ich eigentlich nicht gemeint. Hit.Point wird ja richtig ermittelt aber die Objekte 1,2,3 haben nicht die richtige Lage 3 z.b. sollte eigentlich wie die Cubefläche liegen und nicht stehen oder besser gesagt an die Fläche sich anschmiegen.

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Also hier eine sehr billige Lösung, ist aber noch lange kein Decal-System. Du kannst hier ein Unity-Quad als Decalprefab verwenden.
Allerdings wenn das Decal an einer Kante anliegt, gibt es wieder Probleme, da das Decal dann bei der Kante übersteht.

Für ein ausgefeiltes System müsste man das Quad des Decals prozedural erzeugen und alle 4 Punkte des Quads an die Oberfläche anpassen. Dabei werden zusätzlich 4 weitere Rays ausgesendet und überprüft, ob das Decal noch auf der Oberfläche liegt. Hier wird es dann komplizierter. Ich denke man kann das Decal dann entweder abschneiden oder anhand der Oberfläche "umklappen".

Wenn das Decal sehr klein ist, kann man das Decal auch einfach verschieben, so daß es noch auf der Oberfläche liegt und nicht übersteht.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class DecalPlacer : MonoBehaviour {


    public GameObject decalPrefab;
    public float decalDistance = 0.01f;

	// Update is called once per frame
	void Update () {
        if (Input.GetMouseButtonDown(0))
        {
            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);

            RaycastHit hitInfo;
            bool hitSomething = Physics.Raycast(ray, out hitInfo);

            if (hitSomething)
            {
                GameObject decal = Instantiate(decalPrefab, hitInfo.point + (hitInfo.normal)*decalDistance, Quaternion.identity);
                decal.transform.LookAt(hitInfo.point);
            }
        }
    }
}

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo,

Erst mal danke für deine mühe.

Manchmal sieht man vor lauter Bäumen den Wald nicht.

Hab mit hit.normal u.s.w. alles ausprobiert aber an eine Kombination von diesen Werten " Oh Scham" hab ich nicht gedacht.

Werde es demnächst Testen hab leider noch einige Termine.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo,

 

@Zer0Cool Hab das Script getestet und als dann die selben Fehler auftauchten und ich dein Script als Referenz benutzte stellte ich dann fest das mein Script auch richtig funktioniert.

Der Fehler war das ich einen Cube benutzte und die Z Achse anstatt der X Achse Scaliert habe.Daraus habe ich gelernt das man solche alltäglichen Sachen auch mal überprüfen sollte

bevor man anfängt stundenlang den Code zu zerbröseln und an sich zweifelt.;)

Nochmals danke für deine mühe.

 

Gruß Jog

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.

×
×
  • Neu erstellen...