Algoritma

javabey

git add Brain.java in/earth/people/brainless
Mesajlar
176
En iyi cevaplar
0
Beğeniler
180
Puanları
330
Ruh hali
Senin etrafında dönmesini istiyorsan B -A yani armor standların mekez lokasyonu olan A yı kendine almalısın ve öyle kaydetmelisin.O k yı düzeltmelisin doğru evet eski bir kodumdan alıp düzenledimde onu görmemişim.Vede input locu kendi lokasyonuna setlemelisin.
tam olarak anlayamadım dediği, B benim locum substract(A) yapıp öyle mi kaydetmem lazım
 

ByNovem

Kızıltaş Madencisi
Mesajlar
445
En iyi cevaplar
1
Beğeniler
587
Puanları
1,200
tam olarak anlayamadım dediği, B benim locum substract(A) yapıp öyle mi kaydetmem lazım
evet şimdi oluşturuyorsun ya oluşturduktan sonra döneceği lokasyonu seç mesela etrafında dönecekse tam ortası senin etrafında dönecekse o lokasyondan mesela south a kaydettiysen merkezden 1 northa giderek kaydetmelere başla.ve teleport k3 olacak loc.add değil üzgünüm unutmuşum onu
 

GodofMilker

Nether Yerlisi
Mesajlar
2,196
En iyi cevaplar
0
Beğeniler
2,562
Puanları
6,700
Java:
    @Override
    public void rotate(Location loc) {
        Vector v = armorStand.getLocation().getDirection();
        Vector v1 = v.clone().subtract(loc.getDirection());
        VectorUtil.rotateAroundAxisX(v1, loc.getPitch() * 0.017453292F);
        Location k3 = loc.clone().add(v1);
        teleport(loc.add(k3));
        // yada
        teleport(k3);
    }

bu şekilde diyorsan olmuyor.
Direction baktığı yön diye hatırlıyorum direkt lokasyonları çıkartıp vektörü al
 

ByNovem

Kızıltaş Madencisi
Mesajlar
445
En iyi cevaplar
1
Beğeniler
587
Puanları
1,200
Direction baktığı yön diye hatırlıyorum direkt lokasyonları çıkartıp vektörü al
Evet dediği gibi attığım kod bir rotasyon matrixi kod doğrudur onla bir alakası olduğunu zannetmiyorum üstteki kod sana garip şeyler verecektir.(direction kullanmamalısın)
 

GodofMilker

Nether Yerlisi
Mesajlar
2,196
En iyi cevaplar
0
Beğeniler
2,562
Puanları
6,700
maalesef bir türlü yapamadım,
Java:
public class BaseStructureEntity implements StructureEntity {

    private final Material material;
    private final Location pivot;
    private final ArmorStand armorStand;
    private Location location;

    public BaseStructureEntity(Material material, Location pivot) {
        this.material = material;
        this.pivot = pivot;
        this.location = this.pivot;
        this.armorStand = create();
    }

    @Override
    public ArmorStand create() {
        ArmorStand armorStand = location.getWorld().spawn(location, ArmorStand.class);
        armorStand.setGravity(false);
        armorStand.setVisible(false);
        armorStand.setBasePlate(false);
        armorStand.setSmall(false);
        armorStand.setArms(false);
        armorStand.setInvulnerable(true);
        armorStand.setCanPickupItems(false);
        armorStand.setHelmet(new ItemStack(material));
        armorStand.setCollidable(true);
        return armorStand;
    }

    @Override
    public void teleport(Location location) {
        armorStand.teleport(location);
        this.location = location;
    }

    @Override
    public Location shiftTo(Location location) {
        return this.location.add(
                this.location.getBlockX() - location.getBlockX(),
                this.location.getBlockY() - location.getBlockY(),
                this.location.getBlockZ() - location.getBlockZ());
    }

    @Override
    public void pose(EulerAngle angle) {
        armorStand.setHeadPose(angle);
    }

    @Override
    public void rotate(Location loc) {
        Vector v = armorStand.getLocation().getDirection();
        Vector v1 = v.clone();
        VectorUtil.rotateAroundAxisX(v1, loc.getPitch() * 0.017453292F);
        Location k3 = loc.clone().add(v1);
        teleport(k3);
    }

}
Java:
public class BaseStructureEntityShape implements StructureEntityShape {

    private final double specialNumber = 0.375;
    private final double specialNumber2 = 0.625;

    private final Map<String, Entry<EulerAngle, Material>> shapeIdMap;
    private final Map<Integer, Map<Integer, String[]>> roofShapeMap;

    public BaseStructureEntityShape(Map<String, Entry<EulerAngle, Material>> shapeIdMap,
                                    Map<Integer, Map<Integer, String[]>> roofShapeMap) {

        this.shapeIdMap = shapeIdMap;
        this.roofShapeMap = roofShapeMap;
    }

    @Override
    public Structure createStructure(Location l) {

        final List<StructureEntity> structureEntities = new ArrayList<>();

        for (int roof : roofShapeMap.keySet()) {

            double x = 0;
            double y = calculate(roof) + specialNumber2;
            double z = 0;

            Map<Integer, String[]> shapes = roofShapeMap.get(roof);

            for (int li = 0; li < shapes.size(); li++) {

                double distanceZ = shapes.size() / 2.0 - li + 1;
                z = calculate(distanceZ);

                String[] ids = shapes.get(li);

                for (int idi = 0; idi < ids.length; idi++) {

                    double distanceX = ids.length / 2.0 - (idi + 1);
                    x = calculate(distanceX);

                    String id = String.valueOf(ids[idi]);
                    Entry<EulerAngle, Material> tempMap = shapeIdMap.get(id);

                    if (tempMap == null) continue;
                    if (tempMap.getValue() == Material.AIR) continue;

                    Material material = tempMap.getValue();
                    EulerAngle angle = tempMap.getKey();

                    Location newLoc = newLoc(l, x, y, z);

                    StructureEntity structureEntity = new BaseStructureEntity(material, newLoc);

                    structureEntity.pose(angle);

                    structureEntity.rotate(newLoc);

                    structureEntities.add(structureEntity);

                }
            }
        }

        return new BaseStructure(structureEntities.toArray(new StructureEntity[0]), l);
    }

    private Location newLoc(Location location, double x, double y, double z) {
        return location.clone().add(x,y,z);
    }

    private double calculate(double index) {
        double i = 0;
        if (index > 0) {
            i = index - index * specialNumber;
        } else if (index < 0) {
            i = index + index * -specialNumber;
        }
        return i - 2;
    }

    private int calculateSize() {
        int i = 0;
        for (Map<Integer, String[]> roofShapeMapValues : roofShapeMap.values()) {
            for (String[] roofShapeMapValuesString : roofShapeMapValues.values()) {
                for (String ids : roofShapeMapValuesString) {
                    Entry<EulerAngle, Material> tempMap = shapeIdMap.get(ids);
                    if (tempMap != null) {
                        if (tempMap.getValue() != Material.AIR) i++;
                    }
                }
            }
        }
        return i;
    }

}

Java:
    public void NovemicRotation(Location loc) {
        for (ArmorStand p : pck) {
            Vector v = HashVectorLocation.get(p);  //ArmorStandın ilk lokasyonlarını değiştirmeden kayddiyorsun sonra onları merkezden çıkartıp vektörlüyorsun(B-A olacak şekilde)
            Vector v1 = v.clone();
            VectorUtils.rotateAroundAxisX(v1, (loc.getPitch()) * 0.017453292F);
            VectorUtils.rotateAroundAxisY(v1, -loc.getYaw() * 0.017453292F);
            Location k3 = loc.clone();
            k3.add(v1);
            p.teleport(loc.clone().add(k3));
        }

    }
bu kodda en son ki p.teleport kısmında loc.clone().add(k3) böyle olunca yapı çok başka yerlere gidiyor, direk k3 yaptım bende, biraz fazla armor stand olduğu için ve pc'de render olduğundan kodun yavaş yavaş vectorlemesini görebiliyorum yani kod bir nevi işe yarıyor ancak dediğim gibi kendi etrafında dönüyor yani benim etrafımda döndürmeyi bir türlü yapamadım merkeze kendimi koyamıyorum onu hesaplattırıyorum güya;
Java:
BaseStructureEntity.class > public Structure createStructure(Location l);
double distanceX = ids.length / 2.0 - (idi + 1);
double distanceZ = shapes.size() / 2.0 - li + 1;
bu ikisi ile ama yine banamısın demiyor beni hep en köşeye atıyor
Armorsand mi yoksa blok mu onlar bu arada :c blok gibi duruyorlar da
 

javabey

git add Brain.java in/earth/people/brainless
Mesajlar
176
En iyi cevaplar
0
Beğeniler
180
Puanları
330
Ruh hali
Java:
    @Override
    public void rotate(Location loc) {
        Vector v = armorStand.getLocation().subtract(loc).getDirection();
        VectorUtil.rotateAroundAxisX(v, loc.getPitch() * 0.017453292F);
        Location k = loc.clone().add(v);
        teleport(k);
    }

şimdi sorun şu ki ben bi türlü blockları benim etrafımda döndüremiyorum, sürekli kendi etraflarında dönüyorlar kaydederken bir türlü yapamadım.

Java:
Location eklenmişLoc = newLoc(benimLokum, x, y, z);
StructureEntity structureEntity = new BaseStructureEntity(material, eklenmişLoc );
----------------------------------
private Location newLoc(Location location, double x, double y, double z) {
    return location.clone().add(x,y,z);
}

Armorsand mi yoksa blok mu onlar bu arada :c blok gibi duruyorlar da
armor stand kafasında block var setSmall(false) olduğu için neredeyse block ile aynı boyutta ama yine 6pixellik bi fark var.
 

javabey

git add Brain.java in/earth/people/brainless
Mesajlar
176
En iyi cevaplar
0
Beğeniler
180
Puanları
330
Ruh hali
kendi etraflarına dönmeleri*
1547060072874.png
 

javabey

git add Brain.java in/earth/people/brainless
Mesajlar
176
En iyi cevaplar
0
Beğeniler
180
Puanları
330
Ruh hali
başka bir bilgilendirme* yön SOUTH tek çalışan yön yani
 

GodofMilker

Nether Yerlisi
Mesajlar
2,196
En iyi cevaplar
0
Beğeniler
2,562
Puanları
6,700
Java:
    @Override
    public void rotate(Location loc) {
        Vector v = armorStand.getLocation().subtract(loc).getDirection();
        VectorUtil.rotateAroundAxisX(v, loc.getPitch() * 0.017453292F);
        Location k = loc.clone().add(v);
        teleport(k);
    }

şimdi sorun şu ki ben bi türlü blockları benim etrafımda döndüremiyorum, sürekli kendi etraflarında dönüyorlar kaydederken bir türlü yapamadım.

Java:
Location eklenmişLoc = newLoc(benimLokum, x, y, z);
StructureEntity structureEntity = new BaseStructureEntity(material, eklenmişLoc );
----------------------------------
private Location newLoc(Location location, double x, double y, double z) {
    return location.clone().add(x,y,z);
}


armor stand kafasında block var setSmall(false) olduğu için neredeyse block ile aynı boyutta ama yine 6pixellik bi fark var.
GetDirection sadece yaw ve pitchten bir vektör oluşturuyor toVector diye method olması lazım onu kullanman gerekiyor

Bu halde kalırsa kafaları dönmez sadece lokasyonları playerın arkasına gelecek şekilde olur

Kafalarının da dönmesi için playerın açı değişimi bulman gerekiyor(veya sabit bir playerdan açı saklarsın her blok için onunla işlem yaparsın)
 

javabey

git add Brain.java in/earth/people/brainless
Mesajlar
176
En iyi cevaplar
0
Beğeniler
180
Puanları
330
Ruh hali
GetDirection sadece yaw ve pitchten bir vektör oluşturuyor toVector diye method olması lazım onu kullanman gerekiyor

Bu halde kalırsa kafaları dönmez sadece lokasyonları playerın arkasına gelecek şekilde olur

Kafalarının da dönmesi için playerın açı değişimi bulman gerekiyor(veya sabit bir playerdan açı saklarsın her blok için onunla işlem yaparsın)
kafa döndürme olayı pose ile oluyor onu eulerangle ile yapıyorum
Java:
    @Override
    public void pose(EulerAngle angle) {
        armorStand.setHeadPose(angle);
    }
 

javabey

git add Brain.java in/earth/people/brainless
Mesajlar
176
En iyi cevaplar
0
Beğeniler
180
Puanları
330
Ruh hali
GetDirection sadece yaw ve pitchten bir vektör oluşturuyor toVector diye method olması lazım onu kullanman gerekiyor

Bu halde kalırsa kafaları dönmez sadece lokasyonları playerın arkasına gelecek şekilde olur

Kafalarının da dönmesi için playerın açı değişimi bulman gerekiyor(veya sabit bir playerdan açı saklarsın her blok için onunla işlem yaparsın)
Java:
    @Override
    public void rotate(Location loc) {
        Vector v = location.subtract(loc).toVector();
        VectorUtil.rotateAroundAxisX(v, loc.getPitch() * 0.017453292F);
        Location k = loc.clone().add(v);
        teleport(k);
    }
toVector ile de olmuyor, ya aslında blockların yönlerini değiştirmede bi sorun yok tüm hepsi istediğim gibi dönüyor dediğim tarafa doğru ama armor standler yer değiştirmiyor onun için matris sistemini kullanmam lazım sanırım
 

javabey

git add Brain.java in/earth/people/brainless
Mesajlar
176
En iyi cevaplar
0
Beğeniler
180
Puanları
330
Ruh hali
hani aslında merkezde olmama gerek bile yok yani benim nerde olduğum önemli değil pivot noktası olarak beni görsünler ve ona göre dönseler de oluyor mantıken, ama pivot noktası olarak beni göremiyor kekolar kendi bildikelerini okuyorlar
 

GodofMilker

Nether Yerlisi
Mesajlar
2,196
En iyi cevaplar
0
Beğeniler
2,562
Puanları
6,700
Java:
    @Override
    public void rotate(Location loc) {
        Vector v = location.subtract(loc).toVector();
        VectorUtil.rotateAroundAxisX(v, loc.getPitch() * 0.017453292F);
        Location k = loc.clone().add(v);
        teleport(k);
    }
toVector ile de olmuyor, ya aslında blockların yönlerini değiştirmede bi sorun yok tüm hepsi istediğim gibi dönüyor dediğim tarafa doğru ama armor standler yer değiştirmiyor onun için matris sistemini kullanmam lazım sanırım
Y'ye göre döndürmelisin sanırım ve pitch yukarı aşağı açısı olması lazım yawı kullan yani*
Ve bloklar yok mu oluyor yoksa yanlış mı dönüyor
Ve locationu clonelamadan çıkartıyorsun*
 

GodofMilker

Nether Yerlisi
Mesajlar
2,196
En iyi cevaplar
0
Beğeniler
2,562
Puanları
6,700
Matrixleri kullanmak hakkında pek fikrim yok bu ara bu dönem dersini aldık sadece de geometriye aktarmak hakkında pek fikrim yok xd
Novem sama halleder oraları anca xd
 

javabey

git add Brain.java in/earth/people/brainless
Mesajlar
176
En iyi cevaplar
0
Beğeniler
180
Puanları
330
Ruh hali
Y'ye göre döndürmelisin sanırım ve pitch yukarı aşağı açısı olması lazım yawı kullan yani*
Ve bloklar yok mu oluyor yoksa yanlış mı dönüyor
Ve locationu clonelamadan çıkartıyorsun*
blocklar yok olmuyor, yukarlarda ki resimler gibi yerleri değişmiyor sadece yani kendi etrafında dönüyor benim etrafımda dönmüyor keratalar
 

Üst