Gelangweilt von Werbung 1

22 July 2009 — 22:57

Von Werbung möchte sich heutzutage ja niemand mehr beeinflussen lassen. Doch Werbung geht heute ein Stückchen weiter als in alten Zeiten und ist intelligenter geworden, denn keine Firma sollte und möchte mehr offensichtlich ihre Produkte verkaufen, denn das würde den potenziellen Konsumenten eher abschrecken. Die neuste Werbestrategie nennt sich Neuromarketing und zielt darauf ab potenzielle Konsumenten unterbewusst zum Kauf eines bestimmten Produktes zu verleiten.

Waschmaschine spannender als Werbung

„Das sagt mir mein Bauchgefühl“ ist oftmals der erste Schritt etwas zu tun ohne genau zu wissen warum man es tut. Man muss es einfach tun. Und manchmal ist die Intuitive Handelnsweise nicht die schlechteste. Und genau das nutzen die neusten Marketingstrategien. Dem Kunden wird durch intelligente Werbung ein bestimmtes Produkt schmackhaft gemacht und er wird sich im Geschäft eher für das unterbewusst gemerkte als ein anderes entscheiden. Diesen Effekt erreicht man Sie z.B. indem in Werbespots der Namen der Marke gleich zu Beginn einblendet wird. Das Problem heutzutage für die Hersteller: Die potenziellen Kunden schalten bei Werbung ihr TV-Gerät lautlos oder gar um, weil sie sich genervt fühlen. Außerdem kommt hinzu, dass Fernsehen immer unpopulärer wird. Dafür gewinnen in den Haushalten Videospiele und Mobile Geräte wie zmb PSP oder iPod/iPhone immer mehr an Bedeutung. An diesem Punkt stelt sich für uns die Frage warum man nicht geziehlt kostenlose Spiele anbittet. Diese wiederum beinhalten indirekte Werbung.

Im zweiten Teil mehr zu den Zahlen aus dem Bereich “in game advertising”

1 Kommentar » | Allgemein

iPhone SDK Mesh COLLADA importieren

19 July 2009 — 17:46

Software:    Maya 2008
COLLADA version 1.4
COLLADA Schema unterstützt alle Features, die modern 3D interactive applications brauchen, einschließen Shader Effekten,  Animation und Physik Simulation.
Step 1.
Installieren und laden COLLADA plug in für Maya
Step 2.
Wechseln alle Face vom Model zu Dreiecken: Mesh -> Triangulate. (OpenGL ES 1.x do not support QUADE draw).
Step 3.
Export Model mit mayaCollada, dann habe ich a dae(digital asset exchange) file.  Eigentlich dea file ist erweitern aus XML File.
Step 4.
Gehen wir zurück zu Xcode und import diesen .dae File into project, öffnen es mit Editor, wir können alle informationen über 3D Model, wie Materialien, Effekte, Geometrie… Ich konzentriere mich auf tag “library geomentry” welche ein Kinder Tag “mesh” hat. Der erste Zeile in diesem Block definiert den Name der Geometrie <geometry id=”pCubeShape1″ name=”pCubeShape1″> dann kommt das wichtige Tag <mesh>, darin gibt es 3 “source” und ein “triangles” Blocks, jede hat ein Array : <float_array id=”pCubeShape1-positions-array” count=”24″> (Position der jede vertex), <float_array id=”pCubeShape1-normals-array” count=”72″>, <source id=”pCubeShape1-map1″ name=”pCubeShape1-map1″>  (texture coordinats) and <p> ( bitte sehen Sie Ps). Das ist alles was wir brauchen ein den einfache Mordel zu importieren.
Step 5.
Danach kann ich analysieren das File mit class NSXMLParser vom SDK. In diesem Beispiel male ich Model Figur ohne Texture, deswegen lese ich nur Positions array und die indices array aus <p> aus.

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict {
if(qName) {
elementName = qName;
}

if([elementName isEqualToString:@"accessor"]) {
NSString *accessorAtt = [attributeDict valueForKey:@"source"];
if([accessorAtt isEqualToString:@"#pCubeShape1-positions-array"]) {
NSString *sVertextCount = [attributeDict valueForKey:@"count"];
vertexCount = [sVertextCount intValue];
return;
}

else if([accessorAtt isEqualToString:@"#pCubeShape1-map1-array"]) {
NSString *sMapCount = [attributeDict valueForKey:@"count"];
mapCount = [sMapCount intValue];
return;
}
}

else if([elementName isEqualToString:@"triangles"]) {
NSString *sFaceCount = [attributeDict valueForKey:@"count"];
faceCount = [sFaceCount intValue];
return;
}

else if ([elementName isEqualToString:@"float_array"]) {
NSString *relAtt = [attributeDict valueForKey:@"id"];
if([relAtt isEqualToString:@"pCubeShape1-positions-array"]) {
contentProperty = [NSMutableString string];
array_id = id_positions;
NSLog(@”get positions”);

}

else if([relAtt isEqualToString:@"pCubeShape1-normals-array"]) {
contentProperty = [NSMutableString string];
array_id = id_normals;
NSLog(@”get normals”);
}

else if([relAtt isEqualToString:@"pCubeShape1-map1-array"]) {
contentProperty = [NSMutableString string];
array_id = id_maps;
NSLog(@”get maps”);
}
}

else if ([elementName isEqualToString:@"p"]) {
contentProperty = [NSMutableString string];
NSLog(@”get vertex”);
}

else {
contentProperty = nil;
}
}

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{
if (qName) {
elementName = qName;
}

if ([elementName isEqualToString:@"float_array"]) {
if(array_id == id_positions) {
msd.sPosition = contentProperty;
NSLog(@”set postion”);
array_id = -1;
}

if(array_id == id_normals) {
msd.sNormal = contentProperty;
NSLog(@”set normals”);
array_id = -1;
}

if(array_id == id_maps) {
msd.sMap = contentProperty;
NSLog(@”set maps”);
array_id = -1;
}
}

else if ([elementName isEqualToString:@"p"]) {
msd.sIndices = contentProperty;
NSLog(@”set vertex”);
}

}

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
if (contentProperty) {
[contentProperty appendString:string];
}
}

Step 6.
Zum Schluss malen wir Model mit OpenGL ES.

glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(3, GL_FLOAT, 0, mVertices);

glDrawArrays(GL_TRIANGLES, 0, faceCount*3);

glDisableClientState(GL_VERTEX_ARRAY);

Ps:
<p> beinhaltet Indices, die die Vertexattribute einer Anzahl von Dreiecken beschreiben. Die Indices in einem <p>-Element beziehen sich auf verschiedene Eingaben abhaengig von ihrer Ordnung. Der erste Index in einem <p>-Element bezieht sich auf alle Eingaben mit dem Offset 0. Der zweite Index bezieht sich auf alle Eingaben mit dem Offset 1.
Jede Vertex/Ecke der Dreiecke wird …. Nachdem jede Eingabe benutzt wurde, bezieht sich der naechste Index wieder auf die Eingabe mit Offset 0 und beginnt eine neue Vertex/Ecke.
Die Windungsreihenfolge der produzierten Vertices/Ecken ist entgegen dem Uhrzeigersinn und beschreibt die Vorderseite des jeweiligen Dreiecks.
Wenn die primitives ohne Eckennormalen zusammengestellt sind, dann kann die Anwendung per-primitive …. generieren……

Hier ist ein Beispiel eines <triangle>-Elements dass zwei Dreiecke beschreibt. Es gibt zwei <source>-Elemente, die die Position und die Normalen-Daten enthalten, entsprechend den <input>-Element Bedeutungen. Die <p>-Element Indexwerte geben die Reihenfolge in der die Eingabewerte genutzt werden an:
<mesh>
<source id=”position”/>
<source id=”normal”/>
<vertices id=”verts”>
<input semantic=”POSITION” source=”#position”/>
</vertices>
<triangles count=”2″ material=”Bricks”>
<input semantic=”VERTEX” source=”#verts” offset=”0″/>
<input semantic=”NORMAL” source=”#normal” offset=”1″/>
<p>
0 0 1 3 2 1
0 0 2 1 3 2
</p>
</triangles>
</mesh>

Kommentar » | Allgemein

IPhone 4.0 Patente

13 July 2009 — 13:40

Noch nicht lange ist das iPhone 3Gs auf dem Markt schon wird über Neuerungen nachgedacht.

Das iPhone ist ja schon seit Erscheinen Vorreiter der neuesten Funktionen. Und die ersten neuen Patente für das iPhone 4 sind bereits angemeldet. Diesmal geht es um Haptik, Fingererkennung und einen RFID-Leser.
Bei der haptischen Rückmeldung geht es darum, dass das iPhone auch taktil erkundet wird. Der Screen wird an verschiedenen Stellen vibrieren was eine fast schon blinde Bedienung verspricht.
Die Fingererkennung dient, wie es erst den Anschein hat, weniger der Sicherheit, sondern eher nur um die Erkennung der Nutzer-Fingers. Dadurch wird versprochen, dass einzelne Finger unterschiedliche Funktionen nutzen. So erkennt das Gerät, dass z.B. der Zeigefinger für Play und Stopp bedient, der Mittelfinger fürs Vorspulen und der Ringfinger fürs Zurückspulen.

finger_recognition1
RFID-Tags werden mit Informationen zu Preis oder Art des jeweiligen Artikels in Waren gefüttert. Da RFID immer mehr im Alltag eingesetzt werden, könnte diese Funktion eine sehr gute Ergänzung darstellen.

Weitere neue Patente sollen die “Eventbasierte Modi“ sein. Sie sorgt dafür, dass das iPhone sich beim bedienen speziellen Events anpasst. Seien es Wettereinflüsse, Kalendereinträge, Wochentage, bestimmte News oder einfach laute Umgebungspegel. Z.B. wenn man in einer Theatervorstellung sitzt, sollte das Handy nicht klingeln. Im Prinzip erkennt das iPhone diese Situation und wählt das richtige Profil.

iphone-40-event-based-modes
Eine andere neue Möglichkeit wäre die „Userprogrammierte Kommunikationen”. Sie soll automatisch Glückwünsche zur richtigen Zeit an die Person die man eingestellt hat versenden (z.B. Geburtstage).

Ein weiteres Patent liegt auf dem “Systems and methods for intelligent and customizable communications between devices”. Mit ihm kann man bestimmte Leute wissen lassen wann man von Terminen wieder da und erreichbar ist.

Aber wie auch immer das zukünftige iPhone auch aussehen mag: Bis Apple mit allen Neuerungen betriebsbereit ist, dürfte es noch ein Weilchen dauern.

Mehr Informationen:

Next in your iPhone OS: live object identification, face recognition, text filtering, smarter messaging, voice alteration

iPhone 4.0 OS: event based modes, intellingent and scheduled communications

1 Kommentar » | News

Mekka Anwendung für iPhone 3Gs

29 June 2009 — 22:36

Update

Endlich hat Apple unsere neue Anwendung iMecca freigegeben. iMecca ist eine Anwendung für Muslime. Mit dieser Anwendung wird die Richtung nach Mekka bzw Kaaba gezeigt. Muslime richten sich beim beten nach Kaaba aus. Beim halten des iPhone 3Gs werden die GPS Koordinaten mit der Nord Richtung verrechnet. Das iPhone 3Gs berechnet die Richtung von Mekka bzw Kaaba.
Link zum App Store

imecca_icon_5121

Die letzten paar Tage haben wir die Anwendung “iMecca“ für iPhone 3Gs entwickelt. Diese App Zeigt die korrekte Richtung von Mekka an. Wir warten ab, bis die Anwendung von Apple überprüft wird. Sobald iMecca in App Store verfügbar ist werden wir berichten.

3 Kommentare » | Products

Mac abgestürzt während der Programmierung am iPhone

12 June 2009 — 18:52

Im Moment arbeiten wir an unserem nächsten Production Drop. Während des Codieren ist uns ein Mac abgestürzt. Es hat ein grauen Screen angezeigt, kein Blauen wie bei Windows :-)

grey / blue screen on mac

grey / blue screen on mac


blue / gray screen on mac

blue / gray screen on mac

Kommentar » | Allgemein

Guerilla-Marketing hat keine Akzeptanz in Deutschland

10 June 2009 — 21:02

Guerilla-Marketing erfreut sich in Amerika größter Beliebtheit. Unsere Guerilla-Aktion mit dem Slogan “Your Idea in our Vein” hat uns  auf der “marketing+services” Messe in Frankfurt den Rauswurf gekostet.

dsc00106

2 Kommentare » | Allgemein

Langweilige Firmenpräsentationen

4 June 2009 — 22:04

(Version 0.8)

Jeder Präsentation soll das eigene Unternehmen von der besten Seite zeigen. Man versucht sich erfahren darzustellen und begründet alles mit Projekten.

Der traditionelle Weg ist ein Ppt (Powerpoint) voll mit Text und schönen Überblendungen. Ein Video wird entweder davor oder danach abgespielt. Und nach der ganzen Präsentation erinnert man sich nur an das Video.

Also werden wir versuchen alle unsere Inhalte in ein Comic zupacken. Die Videos werden Bestandteil des Comics. Wir wollen damit sinnige Trennungen innerhalb der Präsentation vermeiden.

forblogpost

Kommentar » | Project management

Properties für Accessoren

3 June 2009 — 10:32

Datenkapselung ist einer der wichtigsten Konzepte in der objektorientierten Programmierung. Um Datenkapselung zu gewährleisten, müssen Setter- und Getter-Methoden (Accessoren) für jede Instanzvariable geschrieben werden. Dies kann unter Umständen sehr zeitaufwendig sein. Die meisten Accessoren haben den gleichen Aufbau und unterscheiden sich lediglich durch die Instanzvariable. Da liegt die Idee nahe, diese Accessoren automatisch generieren zu lassen. Dieses vorgehen nennt man synthetisieren und wurde in Objektive-C 2.0 mit den sogenannten Properties eingeführt.

Propertys haben die allgemeine Syntax:

header
@property (attribut1, attribut2, attribut3, attribut4) datentyp variablenname;

implementation
@syntesize variablenname;

Hat man eine Instanzvariable synthetisiert kann wie folgt darauf zugegriffen werden:

Standard-Syntax
[Obj setVariablenname:wert]
printf(„Der wert lautet %i“, [Obj variablenname]);

Punkt-Syntax
Obj.variblenname = wert;
printf(„Der wert lautet %i“, Obj.variablenname);

Anmerkung:
Die Punkt-Syntax ist unabhängig von den Properties. Es ist möglich die Accessoren selbst zu schreiben (ohne Properties) und über die Punkt Syntax darauf zuzugreifen.

Die 4 Attribute beschreiben folgendes:
-Zugriffsart (readonly, readwrite)
-Setter-Semantik (assign, retain, copy
-Atomicity
-Setter- und Getter-Namen

Zugriffsart

Es gibt 2 Zugriffsarten. Entweder nur lesen (readonly) oder schreiben und lesen (readwrite).
Bei readwrite werden beide Accessoren synthetisiert (vom compiler geschrieben). Im Falle von read wird nur der Getter synthetisiert und somit ist nur ein lesender Zugriff möglich.

Setter-Semantik

Assign

Assign ist die standard Setter-Semantik. Falls man also nichts angibt wird vom Compiler   automatisch assign genommen. Der neue Wert wird der Instanzvariable einfach nur zugewiesen, sonst nichts. Der Referenzcounter wird nicht erhöht. Dadurch ist eine ältere Erhöhung des Referenzcounters ausgeschlossen und er wird somit auch nicht erniedrigt. Dies hat zur Folge, dass die Empfänger -Klasse kein Besitzer des Objektes ist. Wird der Referenzcounter des Objekts von der Sender-Klasse erniedrigt, wird das Objekt gelöscht und ist somit auch nicht mehr für die Empfänger-Klasse erreichbar. Natürlich ist es auch umgekehrt möglich. Deswegen sollte man Propertys mit der assign-Semantik in der dealloc-Methode nicht releasen (den es wurde auch nirgends retained).

Beispiel (vom Compiler generierter Code für den Setter)
-(void)setVariablenname:(id)senderValue
{
   instanceValue = senderValue;
}

 assign

Retain

Retain löst die Problematik der Assign-Semantik. Die Instanzvariable wird zunächst released, da es vielleicht schon auf ein Objekt zeigt. Danach wird der neue Wert zugewiesen und dann wird die Instanzvariable retained. Dies bedeutet nun dass die Empfänger-Klasse ein Besitzer des Objektes ist. Die Sender-Klasse kann das Objekt nun löschen und es ist für die Empfänger-Klasse immernoch  erreichbar. Da man in der Retain-Semantik die Instanzvariable retained, muss sie in der dealloc-Methode auch released werden. Beide Klassen (Sender und Empfänger) zeigen nun auf dasselbe Objekt. Ändert eine Klasse das Objekt ist es auch für die andere geändert.

Beispiel  (vom Compiler generierter Code für den Setter)

-(void)setVariablenname:(id)senderValue
if(instanceValue != senderValue)
  {
    [instanceValue release];
    instanceValue = senderValue;
   [instanceValue retain];
}
}

retain

Copy

Copy erlaubt es einer Klasse der alleinige Beitzer eines Objektes zu werden. Das übergebene Objekt wird kopiert und danach erst zugewiesen. Dies hat den Vorteil dass Empfänger- und Sender-Klasse nicht mehr auf dasselbe Objekt zeigen und somit eine Änderung des Objekts der einen Klasse nicht für das Objekt der Anderen gilt. Die Klasse des übergebenen Objekts muss das NSCopying Protocol implementieren.

Beispiel (vom Compiler generierter Code für den Setter)
-(void)setVariablenname:(id)senderValue
{
if(instanceValue != senderValue)
  {
    [instanceValue release];
    instanceValue = [senderValue copy];
}
}

copy

Atomicity

Atomicity gewährleistet den sicheren Zugriff von mehreren Threads auf die Accessoren. Zu einer bestimmten Zeit darf nur ein Thread auf die Accessoren  zugreifen. Möchte man dies vermeiden gibt man einfach das  Attribut „nonatomic“ an. Mehr dazu auf friday.com

Setter- und Getter-Namen

Wie weiter oben beschrieben sind die Standard-Namen: „setVariablenname:“ (Setter) und „variablenname“ (Getter). Dies kann geändert werden. Um zum Beispiel im Falle von Boolean-Werten für den Getter einen Namen wie „isInitial“ zu erzeugen, kann man als Attribut „getter = isInitial“ angeben. Dadurch kann man auf den Boolwert wie folgt zugreifen:

[Object isInitial];
Object.isInitial;

Natürlich kann auch der Settername durch „setter=andererName“ geändert werden.
Außer man hat als Zugriffsart „read“ definiert, dann gibt es nähmlich einen Compilerfehler, da der Setter nicht existiert.

Quelle
developer.apple.com

3 Kommentare » | ObjC

Ich arbeite an meinen Tutorials

2 June 2009 — 18:24

Mein V-Ray RT Tutorial überzeugte mich nicht, den es fählte eine klare Struktur.  Ich habe es von der V0.8 auf die V0.95 aktualisiert. Weitere Verbesserungen folgen.

Kommentar » | statement

Entfesseltes Ray Tracing “V-ray realtime“

1 June 2009 — 1:36

(Version 0.95)

Die Vorteile von V-Ray RT lassen sich eines typischen Rendering Arbeitsablaufes beschreiben. Üblicherweise wir die Szene aufgesetzt indem zunächst Geometrie erzeugt (Modeling) oder importiert wird, die Beleuchtung gesetzt und anschliessend die Materialien bzw. Shader definiert werden.

Dabei ist die Lichtsetzung besonders aufwendig. In Test Renderings (Preview) werden Lichter in zeitraubenden Korrekturläufen immer wieder angepasst. Ähnlich aufwendig ist die Definition von Materialien. Eigenschaften wie z.B. Reflektionindex, Diffuse und Spekular Farbe müssen entsprechend der Beleuchtung optimal gesetzt werden um ein gewünschtes Rendering Ergebnis zu erzielen. Genau hier setzt V-Ray RT (Realtime) an.

Gleichzeitig kann an Beleuchtung und Shading gearbeitet werden – da sofort ein visuelles Feedback zu sehen ist. Zeitaufwendige Testrenderings werden so auf ein Minimum beschränkt.

Echtzeitberechnung nach 3 Minuten

vray_realtime_3_min1

Testrendering nach 20 Minuten

vray_rendering_20_min

Einführung.

Für dieses kleine Tutorium ist grundlegendes Wissen in 3ds Max erforderlich. Ein paar V-ray Kenntnisse sind von Vorteil, um das gesamt Konzept besser zu verstehen. Ich benutze in meiner Szene eine einfache Geometrie, ein paar V-ray Lichter und eine V-ray Kamera.

1 wir aktivieren die Render engine.

3ds_max_assign_render_vray_realtime

2 wir starten den activeshade

3ds_max_use_activeshade

Ein Fenster geht auf, welches später uns die Szene vorrechnet. Es dauert ein paar Sekunden bis es soweit ist. Bei Netzwerkrendering kann es paar Sekunden länger dauern. So bald die Anwendung läuft updatet sie sehr schnell :-)

3ds_max_ui_vray_realtime

Jetzt können wir an der Szene arbeiten und alles wird direkt aktualisiert.

Einstellungen

vray_realtime_render_settings

Trace depth: Die maximale Anzahl der Licht, Reflektionen und Refraktionen

GI depth: Maximale tiefe der indirekten Illumination

Ray bundle size: Die Anzahl der verarbeiteten Strahlen.

Rays per Pixel: Das ist die antialasing Qualität bzw. die Unterteilung eines Pixels.

Mehr Informationen findet man hier.

Tipps:

  • Die Performance von V-ray realtime ist bestens, kleiner Auflösung macht aber mehr Sinn.
  • Benutze die V-ray Kamera es macht mehr Sinn im gesamt Konzept von V-ray.
  • Szenen mit über eine Million Polygone machen keine Probleme.
  • Spiegelende und Lichtdurchlässige Materialien brauchen mehr Trace depth.
  • Das Netzwerk rendering ist schneller mit kleinen Ray bundle size Werten.

vielen dank an: weltenbauer.

2 Kommentare » | 3d Tutorials

Zurück nach oben