Sida 1 av 1

3d i Visual Basic

Postat: 27 september 2015, 10:10:06
av Swech
Håller på med ett projekt där jag behöver rita en bild på ett mönsterkort (utan komponenter, scannad bild av verkligt kort)
Bara slänga upp en JPG / BMP i ett fönster har jag koll på men jag vill rita upp det hela tiltat i 3d så man ser kortet i perspektiv in i skärmen.
Kortet skall ritas upp i ett VisualBasic program, windows... inga pingviner eller annat....

Någon som har några tips/ kan peka åt rätt håll med exempel.....

Swech

Re: 3d i Visual Basic

Postat: 27 september 2015, 12:53:15
av sodjan
Har den scannade bilden någon som helst Z (höjd) information?
Om inte, hur ska en programvara veta vad som är högre än något annat?
Det är ju bara en platt bild...

Re: 3d i Visual Basic

Postat: 27 september 2015, 13:08:04
av Swech
Det är endast mönsterkortet som skall presenteras. Den har Z = 0 över hela bilden , inga komponenter alltså
Däremot kommer ett munstycke att behöva ritas in med ett eget z > 0 värde som då "svävar" ovanför kortet.

Swech

Re: 3d i Visual Basic

Postat: 27 september 2015, 13:38:04
av Jan Almqvist
Att göra en avbildning från R^3 till R^2 låter som en kul programmeringsuppgift oavsett OS.

Re: 3d i Visual Basic

Postat: 27 september 2015, 13:55:22
av Andax
Sök på OpenGL och Visual Basic.

Re: 3d i Visual Basic

Postat: 27 september 2015, 14:02:47
av Swech
Jag vill alltså att Test1 skall visas som Test2

Swech

Re: 3d i Visual Basic

Postat: 27 september 2015, 14:08:55
av meconer
Nu är det inte visual basic, men i java så finns det bra funktioner för att manipulera bilder. Det där skulle man kunna uppnå med Javas AffineTransform .shear . Kanske det finns något liknande i VB?

Re: 3d i Visual Basic

Postat: 27 september 2015, 14:15:24
av meconer
Kanske inte ändå förresten. Vid närmare eftertanke så förflyttar shear bara pixlarna i sidled eller upp och ner. Men det borde kunna gå att räkna ut värdet för varje pixel med en liten loop.

Re: 3d i Visual Basic

Postat: 27 september 2015, 14:31:16
av Jan Almqvist
Två loopar, en för x, en för y, GetPixel(), lite matematik. SetPixel(), Klart.

Re: 3d i Visual Basic

Postat: 27 september 2015, 15:10:49
av meconer
Roade mig lite med att sätta ihop det i Java...

Kod: Markera allt

package ImageTo3D;


import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

/**
 *
 * @author Mats
 */
public class Main {
    
    public static void main (String[] args) {
        BufferedImage startImage;
        final double scaleX = 0.7;
        final double scaleY = 0.7;
        try {
            startImage = ImageIO.read( new File("C:\\Users\\Mats\\Downloads\\test1.jpg") );
            
            int startImgWidth = startImage.getWidth();
            int startImgHeight = startImage.getHeight();
            
            int midPointX = startImgWidth / 2;
            
            int img3DWidth = startImgWidth;
            int img3DHeight = (int) (startImgHeight * scaleY);
            
            BufferedImage img3D = new BufferedImage( img3DWidth, img3DHeight,  BufferedImage.TYPE_BYTE_INDEXED);
            
            for ( int x = 0 ; x < img3DWidth; x++ ){
                for ( int y = 0 ; y < img3DHeight; y++ ) {
                    double scaleLine = scaleX + (1-scaleX) * (double) y / (double) img3DHeight;
                    if ( x==0 ) System.out.println(scaleLine);
                    int transformPixelX = (int) ( (x - midPointX) / scaleLine + midPointX );
                    int transformPixelY = (int) ( y / scaleY);
                    
                    int pixelData;
                    if ( transformPixelX < 0 || transformPixelX >= startImgWidth) pixelData = 0xFFFFFF; // Vit pixel
                    else pixelData = startImage.getRGB(transformPixelX, transformPixelY);
                    
                    img3D.setRGB(x, y, pixelData);
                }
            }
            ImageIO.write(img3D, "jpg", new File( "C:\\Users\\Mats\\Downloads\\output.jpg" ) );
        } catch (IOException ex) {
            System.out.println( ex.getMessage());
        }
        
    }
    

}

Re: 3d i Visual Basic

Postat: 27 september 2015, 15:14:04
av meconer
Ursäkta den usla (obefintliga) kommenteringen. Det är heller ingen medelvärdesbildning av de pixlar som man hämtar data ifrån så resultatet blir inte så bra som det skulle kunna bli om man fick med det också.
output.jpg

Re: 3d i Visual Basic

Postat: 27 september 2015, 15:26:06
av Swech
:bravo: Tackar för detta exempel.
Resultatet är fullt tillräckligt

Swech

Re: 3d i Visual Basic

Postat: 27 september 2015, 15:33:10
av meconer
Ingen orsak. Det är så kul att programmera sånt. Men tänk om man kunde lära sig att kommentera nån gång... De gånger jag har lyckats med att "komma igång" med bra kommentering så brukar jag skriva vad jag tänker göra i kommentarer innan jag går på själva kodandet. Då blir oftast också koden stilig och välfungerande eftersom man tvingas tänka igenom vad man skall göra i förväg.

Re: 3d i Visual Basic

Postat: 27 september 2015, 15:49:43
av Andax
I openGL så kan man skapa en sk quad och sedan lägga en bild som textur. Då kan man vrida och vända på den.