Pokaż wiadomości

Ta sekcja pozwala Ci zobaczyć wszystkie wiadomości wysłane przez tego użytkownika. Zwróć uwagę, że możesz widzieć tylko wiadomości wysłane w działach do których masz aktualnie dostęp.


Wiadomości - duga

Strony: [1]
1
O, macierz Viewport, wcale o tym nie widziałem. Robiłem tylko projection * view * global, bo tak było w slajdach od prowadzącego. Poczytam sobie o viewport (tak wcześniej trochę o tym czytałem, ale o viewport nie doczytałem widocznie).

Dzięki, bałagan jest bo to ofc. program na labki, więc nawet nie ma czasu ładnie tego pisać ;-)

2
Piszę sobie program w javie coś ala 3d modelling. Aktualnie mam problem by połączyć te wszystkie macierze tak, aby na ekranie wyświetlało się to tak, jakby ktoś patrzył faktycznie oczami. A u pomimo, że jest perspektywa (linie zbiegają się do punktu) nie jestem w stanie tego połączyć tak by to normalnie wyglądało - punkt 0,0 jest na środku ekranu a ja chce by to kamera była w (0,0). Chcę też osiągnąć efekt przesuwania , obracania kamery i zooming...

Kawałek najważniejszego kodu:

public void paint(Graphics g) {
final long start = System.nanoTime();
Vector scale = null;
scale = settings.getCameraScale();

WritableRaster raster = null;
final int width = image.getWidth();
final int height = image.getHeight();
final Dimension size = new Dimension(width, height);
byte[] buff = null;
raster = image.getRaster();
buff = new byte[4 * width * height];

changed = false;

g.setColor(Color.BLACK);
g.fillRect(0, 0, 800, 600);

for (final double[] element : zBuffer)
Arrays.fill(element, Double.MAX_VALUE);

g.setColor(Color.WHITE);
gImage.setColor(Color.BLACK);
gImage.fillRect(0, 0, size.width, size.height);

final double myRotateX = rotateX;
final double myRotateY = rotateY;
final Vector eye = settings.getLocation();
final Vector target = settings.getLookAt();

try {

final Matrix globalMatrix = Matrix.RotateMatrix(1, 0, 0,
Math.PI * myRotateY * 2.00).multiply(
Matrix.RotateMatrix(0, 1, 0, Math.PI * myRotateX * 2.00)
.multiply(
Matrix.ScaleMatrix(scale.get(0),
scale.get(1), scale.get(2))));

Vector up = new Vector(new double[] { 0, 1, 0 });

Triangle tStart = new Triangle(new Point(0, 0, 0), new Point(1, 0,
0), new Point(0, 1, 0));

final Matrix cameraMatrix = Matrix.LookAt(eye, target, up);
final Matrix cameraSpaceMatrix = cameraMatrix
.multiply(globalMatrix);

final Matrix projectionMatrix = Matrix.TranslateMatrix(400, 300, 0)
.multiply(
Matrix.PerspectiveThrow1(d).multiply(
cameraSpaceMatrix));

for (final Triangle t : triangles) {

final Vector view = t.getMiddle().getVector3();
view.set(2, view.get(2) + d);

final Triangle tNonProjected = t.Transform(globalMatrix);
final Triangle tProjected = t.Transform(projectionMatrix);

if (tProjected.getNormal().ScalarMultiply(view) > 0)
continue;

if (!gridMode) {

final Vector lightSource = new Vector(new double[] { 123,
312, 666 });

final Vector N1 = tNonProjected.getNormalP1().versor();
final Vector N2 = tNonProjected.getNormalP2().versor();
final Vector N3 = tNonProjected.getNormalP3().versor();
final LightSource Is = new LightSource(0, 0, 1);
final double nShiny = 1.0;

Vector V1, V2, V3, R1, R2, R3;
V1 = V2 = V3 = R1 = R2 = R3 = new Vector(new double[] { 0,
0, 1 });

final Vector L1 = new Vector(tNonProjected.data.p1
.getVector3().remove(lightSource)).versor();
final Vector L2 = new Vector(tNonProjected.p2.getVector3()
.remove(lightSource)).versor();
final Vector L3 = new Vector(tNonProjected.p3.getVector3()
.remove(lightSource)).versor();

tProjected.draw(buff, size, zBuffer, new GouraudProvider(d,
kA, kD, kS, N1, N2, N3, L1, L2, L3, V1, V2, V3, R1,
R2, R3, nShiny, Is, tProjected.data.p1,
tProjected.p2, tProjected.p3), tNonProjected);

g.setColor(Color.GREEN);
} else {

gImage = image.getGraphics();

g.setColor(Color.RED);
final int rgb = Color.WHITE.getRGB();

C2dDrawing.drawLine(buff, size, tProjected.data.p1,
tProjected.p2, rgb, zBuffer);
C2dDrawing.drawLine(buff, size, tProjected.p2,
tProjected.p3, rgb, zBuffer);
C2dDrawing.drawLine(buff, size, tProjected.p3,
tProjected.data.p1, rgb, zBuffer);
}

}
Triangle tStartDraw = tStart.Transform(projectionMatrix);
tStartDraw.draw(buff, size, zBuffer, null, tStart);
} catch (final Exception excp) {
excp.printStackTrace();
}
raster.setDataElements(0, 0, width, height, buff);

g.drawImage(image, 0, 0, null);
final long diff = System.nanoTime() - start;
Lab5_3d.lg.info("" + 1e9 / diff + "x" + ", " + diff / 1e6
+ "ms triangles: " + triangles.length);

}

Ew. cały kod + .jar do odpalenia w katalogu uploads Lab5_3d.zip i 3d.jar.
https://www.dropbox.com/sh/jzmj1h1q84146y3/K2iUzRd6yM

Byłbym wdzięczny za pomożenie mi w rozwiązaniu tego problemu

3
Grafika 2D / AntyAliasing - nie działa poprawnie (multisampling)
« dnia: Październik 20, 2012, 22:41:49 »
Napisałem sobie alg. wg. przepisu (graficznego) mojego prowadzącego AntyAliasingu. Coś robi poprawnie, ale nie do końca. W zależności od gałęzi |x| >= |y| lub na odwrót albo góra albo dół linii jest nieatyaliasowany, natomiast drugi brzeg jest antyaliasowany. Ktoś mógłby podać linka do poprawnego multisamplingu lub pomóc w rozgryzieniu tej zagadki?

Kod (w paczce z resztą też jest)

        private void AntyAliasedLineDraw(Point from, Point to, int grubosc)
        {

            double offsetX = to.X - from.X;
            double offsetY = to.Y - from.Y;
            var fromX = from.X;
            var fromY = from.Y;
            var toX = to.X;
            var toY = to.Y;

            if (Math.Abs(offsetX) >= Math.Abs(offsetY))
            {
                // robimy po x
                if (from.X > to.X)
                {
                    fromX = to.X;
                    fromY = to.Y;
                    toX = from.X;
                    toY = from.Y;
                    offsetX = -offsetX;
                    offsetY = -offsetY;
                }

                var yPerPixel = offsetY/offsetX;
                double actualHeight = _Sampling*fromY;

                for (var j = _Sampling * fromX; j <= _Sampling * toX; j++) // robimy po X-ach
                {
                    var bottom = (int)Math.Floor((double)actualHeight + grubosc*_Sampling);
                    var top = (int)Math.Ceiling((double) actualHeight);

                    for (var i = top; i <= bottom; i++)
                        _Pkts[j,i] = true;

                    actualHeight += yPerPixel;
                }

                actualHeight = fromY;

                for (var j = fromX; j <= toX; j++)
                {
                    var bottom = (int)Math.Floor((double)actualHeight + grubosc);
                    var top = (int)Math.Ceiling((double)actualHeight);

                    for (var i = top; i <= bottom; i++ )
                    {
                        var ile = 0;
                        for (var k = 0; k < _Sampling; k++)   // x
                            for (var l = 0 ; l < _Sampling; l++) // y
                            {
                                if (_Pkts[_Sampling * j + k, _Sampling * i + l] == true)
                                {
                                    _Pkts[_Sampling*j + k, _Sampling*i + l] = false;
                                    ++ile;
                                }
                            }
                     
                        var stos = (double) ile/(double) (_Sampling*_Sampling);
                        stos = 1 - stos;
                        //var stos = 0;
                        var war = (int)Math.Floor(255.00*stos);
                        _Bmp.SetPixel(j, i, Color.FromArgb(war, war, war));
                    }
                        actualHeight += yPerPixel;
                }


            }
            else
            {
                // robimy po y
                if (from.Y > to.Y)
                {
                    fromX = to.X;
                    fromY = to.Y;
                    toX = from.X;
                    toY = from.Y;
                    offsetX = -offsetX;
                    offsetY = -offsetY;
                }

                var xPerPixel = offsetX / offsetY;
                double actualWidth = _Sampling * fromX;

                for (var i = _Sampling * fromY; i <= _Sampling * toY; i++) // robimy po X-ach
                {
                    var right = (int)Math.Floor((double)actualWidth + grubosc * _Sampling);
                    var left = (int)Math.Ceiling((double)actualWidth);

                    for (var j = left; j <= right; j++)
                        _Pkts[j, i] = true;

                    actualWidth += xPerPixel;
                }

                actualWidth = fromX;

                for (var i = fromY; i <= toY; i++)
                {
                    var right = (int)Math.Floor((double)actualWidth + grubosc);
                    var left = (int)Math.Ceiling((double)actualWidth);

                    for (var j = left; j <= right; j++)
                    {
                        var ile = 0;
                        for (var l = 0; l < _Sampling; l++)   // y
                            for (var k = 0; k < _Sampling; k++) // x
                            {
                                if (_Pkts[_Sampling * j + k, _Sampling * i + l] == true)
                                {
                                    _Pkts[_Sampling*j + k, _Sampling*i + l] = false;
                                    ++ile;
                                }
                            }

                        var stos = (double)ile / (double)(_Sampling * _Sampling);
                        stos = 1 - stos;
                        //var stos = 0;
                        var war = (int)Math.Floor(255.00 * stos);
                        _Bmp.SetPixel(j, i, Color.FromArgb(war, war, war));
                    }
                    actualWidth += xPerPixel;
                }

            }

        }

W przypadku złego działu (a czuje to) proszę o przeniesienie do właściwego działu =

4
Design / Odp: Tworzenie mapy / levelu do gry
« dnia: Luty 25, 2012, 13:06:18 »
Co masz na myśli? Format binarny mapy? To dokładnie to samo co bitmapa - tylko zamiast kolorów masz cyferki (ale tak na prawdę kolory to też cyferki). Tyle że jak wiesz że masz tylko 16 kafli, to na jednym kolorze możesz ich trzymać 8.

Hmm, tak dokładnie mam to na myśli, co napisałem ;p Trochę nieprecyzyjnie się wyraziłem. Chodziło mnie dokładnie o mapy w postaci dat, które bardzo często widziałem w różnych grach ;>

5
Design / Odp: Tworzenie mapy / levelu do gry
« dnia: Luty 25, 2012, 12:59:33 »
A mapy binarne, ktoś słyszał coś na ten temat? Teoretycznie można by było zrobić zrzut pamięci

6
Design / Tworzenie mapy / levelu do gry
« dnia: Luty 24, 2012, 17:52:46 »
Chciałbym się zapytać jak można najłatwiej zrobić mapę do gry. Słyszałem np. o stworzeniu mapy w tekście, gdzie np. 'x' to pusty kafelek, 'o' miejsce startu bohatera itd. Mógłby ktoś mnie podać inne metody tworzenia ręcznego map / leveli do gier?

Strony: [1]