C++Programming Language

Creative Code ทำ Op Art ด้วย openFrameWorks C++ การจัดการ MouseMovement

ในบทเรียนนี้เราจะมาศึกษาการใช้งานร่วมกับ Interactive กัน นั่นคือ MouseMovement ร่วมกับ openFrameWorks ที่จะมี C++ ฟังก์ชันอย่าง ofApp::mouseMoved(int x, int y ) ให้เรียกใช้ทำงานอยู่แล้วนั่นเอง

หลังจากที่เราเรียนรู้บทเรียนก่อนหน้า
Creative Coding ด้วย C++ และ openFrameworks การเขียนโปรแกรมเบื้องต้น
Creative Coding ด้วย C++ บน Visual Studio 2022 และ openFrameWorks

รอบนี้เราจะมาเรียนรู้การทำงานร่วมกับ Mouse Cursor กัน

ในงานนี้จะลองเอาแรงบันดาลใจจากศิลปิน Bridget Riley เป็นศิลปินชาวอังกฤษที่มีชื่อเสียงในการสร้างงานศิลปะที่เรียกว่า Op Art (Optical Art) ซึ่งเป็นรูปแบบศิลปะที่ใช้ลวดลายและสีที่ทำให้เกิดภาพลวงตาทางสายตา งานของเธอมักใช้รูปทรงเรขาคณิต เส้น และสีสันที่จัดจ้านในการจัดวางที่ซับซ้อน ทำให้ผู้ชมรู้สึกถึงการเคลื่อนไหว ความสั่นสะเทือน หรือการบิดเบือนของภาพ แม้ว่าจะเป็นเพียงภาพนิ่งก็ตาม

Bridget Riley ได้รับการยอมรับว่าเป็นหนึ่งในศิลปินสำคัญที่มีบทบาทในการพัฒนาศิลปะสมัยใหม่และ Op Art เธอได้รับรางวัลและเกียรติคุณมากมายจากผลงานของเธอ และยังคงเป็นที่ชื่นชอบในวงการศิลปะทั่วโลกจนถึงปัจจุบัน ผลงานของเธอยังคงถูกจัดแสดงในพิพิธภัณฑ์และแกลเลอรีชั้นนำหลายแห่ง

โอเค เราจะมาทำงาน Op Art กัน 1 งานให้มัน Movement ตาม Mouse ให้ทำการเปิด Project Generator ขึ้นมา

สำหรับ JS ก็มีวิธีการนะครับ อ่านที่นี่: How to Create Op Art Inspired by Bridget Riley with JavaScript

พอโปรเจ็คพร้อมให้เปิดไฟล์ ofApp.h

ให้เพิ่มตัวแปร mousePos ลงไปเพื่อเก็บตำแหน่งของ Mouse Position

#pragma once
#include "ofMain.h"
class ofApp : public ofBaseApp{

	public:
		void setup();
		void update();
		void draw();

		void keyPressed(int key);
		void keyReleased(int key);
		void mouseMoved(int x, int y );
		void mouseDragged(int x, int y, int button);
		void mousePressed(int x, int y, int button);
		void mouseReleased(int x, int y, int button);
		void mouseEntered(int x, int y);
		void mouseExited(int x, int y);
		void windowResized(int w, int h);
		void dragEvent(ofDragInfo dragInfo);
		void gotMessage(ofMessage msg);

		float mouseXPos;
		
};

หลังจากนั้นเปิดไฟล์ ofApp.cpp ขึ้นมา เพื่อไปฟังก์ชัน ofAppSetup()

void ofApp::setup(){
	ofBackground(255);  // White background
	mouseXPos = 0;      // Initialize mouse X position
        ofHideCursor();
}

Code นี้เป็นโปรแกรมที่เขียนด้วย openFrameworks เพื่อสร้างภาพที่ประกอบไปด้วยจุด (dots) บนหน้าจอ โดยตำแหน่งและขนาดของจุดจะเปลี่ยนแปลงตามการเคลื่อนไหวของเมาส์ เพื่อสร้างเอฟเฟกต์คล้ายภาพลวงตาทางสายตา (optical illusion)

ตั้งค่าพื้นหลังให้เป็นสีขาวโดยใช้ ofBackground(255), โดย 255 หมายถึงค่าสีขาวในระบบ RGBกำหนดค่าเริ่มต้นให้ตัวแปร mouseXPos เท่ากับ 0 เพื่อติดตามตำแหน่งแกน X ของเมาส์ใช้ ofHideCursor() เพื่อซ่อนเคอร์เซอร์ของเมาส์บนหน้าจอ

void ofApp::draw(){
    float dotSpacing = 30;                  // ระยะห่างระหว่างจุด
    int rows = ofGetHeight() / dotSpacing;  // จำนวนแถว
    int cols = ofGetWidth() / dotSpacing;   // จำนวนคอลัมน์
    float waveIntensity = (mouseXPos / (float)ofGetWidth()) * 15; // ความเข้มของเอฟเฟกต์คลื่น

    for (int y = 0; y < rows; y++) {
        for (int x = 0; x < cols; x++) {
            float size = 8 + sin((x + y) * 0.5 + waveIntensity) * 6; // ขนาดของจุดที่เปลี่ยนแปลง
            ofSetColor(200 - y * 5, 200 - x * 5, 200);               // กำหนดสีของจุด
            ofDrawCircle(x * dotSpacing, y * dotSpacing, size);      // วาดจุดในตำแหน่งที่กำหนด
        }
    }
}

dotSpacing กำหนดระยะห่างระหว่างจุดเป็น 30 หน่วยrows และ cols คำนวณจำนวนแถวและคอลัมน์ของจุด โดยอ้างอิงจากความสูงและความกว้างของหน้าจอwaveIntensity คำนวณความเข้มของเอฟเฟกต์คลื่น โดยพิจารณาจากตำแหน่งแกน X ของเมาส์ (mouseXPos) ซึ่งจะทำให้ภาพดูมีการเคลื่อนไหวตามเมาส์ในการวนลูป for ซ้อนกัน จะวาดจุดในตำแหน่งที่กำหนด (x และ y) โดย:

  • ขนาดของจุด (size) จะเปลี่ยนแปลงไปตามฟังก์ชัน sine เพื่อสร้างเอฟเฟกต์คลื่น
  • สีของจุด (ofSetColor) จะเปลี่ยนแปลงตามตำแหน่งของจุด เพื่อสร้างลักษณะของการเลือนสี

ฟังก์ชัน mouseMove() นี้จะถูกเรียกเมื่อเมาส์เคลื่อนที่ อัปเดตค่าของ mouseXPos ให้เท่ากับตำแหน่งแกน X ของเมาส์ (x)

void ofApp::mouseMoved(int x, int y ){
    mouseXPos = x;
}

ภาพรวม code เป็นดังนี้:

#include "ofApp.h"

//--------------------------------------------------------------
void ofApp::setup(){
	ofBackground(255);  // White background
	mouseXPos = 0;      // Initialize mouse X position
        ofHideCursor();
}

//--------------------------------------------------------------
void ofApp::update(){

}

//--------------------------------------------------------------
void ofApp::draw(){
    float dotSpacing = 30;                  // Space between dots
    int rows = ofGetHeight() / dotSpacing;  // Number of rows
    int cols = ofGetWidth() / dotSpacing;   // Number of columns
    float waveIntensity = (mouseXPos / (float)ofGetWidth()) * 15; // Wave effect

    for (int y = 0; y < rows; y++) {
        for (int x = 0; x < cols; x++) {
            float size = 8 + sin((x + y) * 0.5 + waveIntensity) * 6; // Dot size variation
            ofSetColor(200 - y * 5, 200 - x * 5, 200);               // Color variation
            ofDrawCircle(x * dotSpacing, y * dotSpacing, size);      // Draw dot
        }
    }
}
//--------------------------------------------------------------
void ofApp::mouseMoved(int x, int y ){
    mouseXPos = x;
}

ทำการ Run งานของเราจะได้ตามนี้

Asst. Prof. Banyapon Poolsawas

อาจารย์ประจำสาขาวิชาการออกแบบเชิงโต้ตอบ และการพัฒนาเกม วิทยาลัยครีเอทีฟดีไซน์ & เอ็นเตอร์เทนเมนต์เทคโนโลยี มหาวิทยาลัยธุรกิจบัณฑิตย์ ผู้ก่อตั้ง บริษัท Daydev Co., Ltd, (เดย์เดฟ จำกัด)

Related Articles

Back to top button
Game & Mobile Development AR VR XR
Privacy Overview

This website uses cookies so that we can provide you with the best user experience possible. Cookie information is stored in your browser and performs functions such as recognising you when you return to our website and helping our team to understand which sections of the website you find most interesting and useful.

Adblock Detected

เราตรวจพบว่าคุณใช้ Adblock บนบราวเซอร์ของคุณ,กรุณาปิดระบบ Adblock ก่อนเข้าอ่าน Content ของเรานะครับ, ถือว่าช่วยเหลือกัน